在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,所以不需要显式地执行。