2017-07-26 51 views
0

我想按順序執行4個函數。每個功能都是以下格式。像創建更新刪除和顯示。我想在完成其他3個功能後調用顯示功能。我嘗試了承諾方法,但沒有任何數據庫調用它按順序工作。當發生貓鼬呼叫時,訂單正在變化。如何同步調用nodejs中包含mongoose查詢的多個函數?

function createProjects(req) { 
var projects = req.body.created; 
projects.forEach(function (project) { 
    var newProject = new ProjectSchema(project); 
    newProject.save(function (error, object) { 
     if (error) { 
      console.log(error) 
     } 
     console.log(object) 
    }); 
}); 
} 

如何解決此問題?

回答

0

您需要使用類似bluebird.eachasync庫或下一個回調隊列之類的代碼來等待一個承諾完成後才能開始下一個承諾。該句的第一部分可能聽起來像是某種東西,但在node.js中,.save將始終立即返回,而不管執行回調的時間(使其在代碼中不太明顯)。

以下是bluebird.each的示例我試圖堅持使用示例代碼中的代碼風格。

var Promise = require('bluebird'); 

    function createProjects(req) { 
     var projects = req.body.created; 
     return Promise.each(projects, function (project) { 
      return new ProjectSchema(project).save(); 
     }); 
    } 
+0

提示:'newProject.save()'已經返回一個承諾,你沒有把它包起來(或傳遞一個回調的話) – robertklep

+0

@robertklep謝謝你的提示,我會更新時,我可以。會使它更簡短。 – Catalyst

+0

我已經根據此改變了代碼,調用了下面的承諾。 'createProjects(REQ) 。然後(updateProjects(REQ)) 。然後(displayProjects(REQ))' 仍然createProjects呼籲displayProjects只 –