在promise中定义asynchronous函数

我正在使用.then编写承诺代码。 现在,我决定使用await / async来编写它。 我已经在promise中调用了一个函数add_Lessons ,然后在那个函数中调用另一个函数。 这是我的代码使用.then

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); }) }); } ); }; 

这是使用await / async的代码。

 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中定义asynchronous函数?

你把一个错误的函数前面的async 。 这个function应该是async

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

喜欢这个:

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

只能在具有async关键字的函数内部使用await不能使用其他具有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()函数返回的promise。

您正在混合asynchronous控制stream的三种方式:callback,承诺和asynchronous/等待。 你需要充分理解所有这些,才能把它们毫无问题地结合起来。

我会build议编写一个包装器,返回承诺callback的所有function,如下所示:

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

(或者你可以使用Bluebird的promisify),现在你可以很容易地在你的asynchronous/等待stream程中使用它:

 async function create_section(sections, course_ID, i) { var s_duration = 0; var sname = sections[i].name; var s_obj = { //some obj } var section_id; var data = await sectionCreate(s_obj); var section_id = data_s._id; var lesson = sections[i].lessons; var arr = await add_lessons(lesson, section_id, i); return arr; } 

这假定add_lessons()返回一个暗示的承诺,但是你的代码却可能不是这样。 您可以await承诺,以便您可以在返回承诺的函数调用之前使用await

请注意,每个async函数都会返回一个promise,所以不需要显式地执行。