2017-05-29 87 views
2

我正在使用編寫承諾代碼,然後。現在,我決定使用await/async編寫它。我已經調用函數add_Lessons內部承諾,然後調用另一個函數,然後該功能。這裏是我的代碼,使用,然後定義承諾內的異步函數

function create_section(sections,course_ID,i) { 
return new Promise(
    (resolve) => { 
     var s_duration = 0; 
     var sname = sections[i].name; 
     var s_obj = { 
      //some object; 
     } 
     var section_id; 
     DB.section.create(s_obj,function (err, data_s) 
     { 
      if (err) return next(err); 
      section_id = data_s._id; 
      var lesson = sections[i].lessons; 
      add_lessons(lesson,section_id,i) 
      .then(function(arr){ 
       resolve(arr); 
      }) 
     }); 
    } 
); 
}; 

這是使用等待/異步的代碼。

function create_section(sections,course_ID,i) { 
return new Promise(
    async function resolve() { 
     var s_duration = 0; 
     var sname = sections[i].name; 
     var s_obj = { 
      //some obj 
     } 
     var section_id; 
     DB.section.create(s_obj,function (err, data_s) 
     { 
      if (err) return next(err); 
      section_id = data_s._id; 
      var lesson = sections[i].lessons; 
      var arr = await add_lessons(lesson,section_id,i) 
      resolve(arr); 
     }); 
    } 
); 
}; 

使用await/async的代碼顯示add_lessons是意外標識符的錯誤。 那麼告訴我如何在promise中定義異步函數?

+0

避免['Promise' constructor antipattern](https://stackoverflow.com/q/23803743/1048572?What-is-the-promise-construction-antipattern-and-how-to-avoid-it)! – Bergi

回答

2

你把async放在一個錯誤的函數前面。這個功能應該是async

DB.section.create(s_obj,function (err, data_s) 

這樣的:

DB.section.create(s_obj, async function (err, data_s) 

您可以使用await只有內部有async關鍵字的功能 - 不是在那些有async關鍵字等功能中的所有功能。

但是,您應該傳遞給new Promise()構造函數的函數是將resolve作爲參數而不是函數本身的名稱爲resolve的函數。取而代之的是:

return new Promise(
    async function resolve() { 

你應該使用類似:

return new Promise(function (resolve, reject) { 

,然後還你應該運行reject而不是next(error) - 所以不是:

if (err) return next(err); 

您可以嘗試:

if (err) return reject(err); 

如果您確實想拒絕從create_section()函數返回的承諾。

您正在混合異步控制流的三種方式:回調,承諾和異步/等待。你需要充分理解所有這些,才能將它們毫無問題地結合起來。

我會建議寫一個包裝返回承諾對所有這一切需要回調,像這樣的功能:

const sectionCreate = (...args) => new Promise((resolve, reject) => { 
    DB.section.create(...args, (err, data) => { 
    if (err) { 
     return reject(err); 
    } 
    resolve data; 
    }); 
}); 

(或者你可以使用藍鳥的爲promisify) ,現在你就可以使用在你的異步/伺機易於流動:

​​

這假定add_lessons()返回其隱含的希望,但是你的代碼,但它可能不會是這樣。你可以在承諾中使用await,這樣你就可以在返回承諾的函數調用之前使用await

請注意,每個async函數都會返回一個承諾,因此您不需要明確地執行該操作。

+0

謝謝你的幫助...你能否請我建議一些很好的材料來學習node.js ...我知道node.js的基礎知識,再次感謝... –

+0

@akashmodi我可以推薦由Pedro Teixeira的Node Tuts for http://nodetuts.com/是一個很好的開始,我推薦使用CodeSchool:https://www.codeschool.com/courses/real-time-web-with-node-js和NodeSchool:https://nodeschool.io /在YouTube上加上很多優秀的教程和講座。祝你好運! – rsp

+0

@akashmodi同時搜索Domenic Denicola關於Promises的會談。 – rsp