aka*_*odi 4 javascript mongodb node.js promise
我正在使用.then为Promise编写代码。现在,我决定使用 await/async 来编写它。我已经调用的函数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);
})
});
}
);
};
Run Code Online (Sandbox Code Playgroud)
这是使用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);
});
}
);
};
Run Code Online (Sandbox Code Playgroud)
使用 await/async 的代码显示了 add_lessons 是意外标识符的错误。那么告诉我如何在promise中定义异步函数?
你async前面放错了函数。这个功能应该是async:
DB.section.create(s_obj,function (err, data_s)
Run Code Online (Sandbox Code Playgroud)
像这样:
DB.section.create(s_obj, async function (err, data_s)
Run Code Online (Sandbox Code Playgroud)
您await只能在具有async关键字的函数内部使用- 不能在具有关键字的其他函数内部的所有函数中使用async。
但是,您应该传递给new Promise()构造函数的是一个将其resolve作为参数的函数,而不是一个本身名为 的函数resolve。取而代之的是:
return new Promise(
async function resolve() {
Run Code Online (Sandbox Code Playgroud)
你应该使用类似的东西:
return new Promise(function (resolve, reject) {
Run Code Online (Sandbox Code Playgroud)
然后你可能应该运行reject而不是next(error)- 所以而不是:
if (err) return next(err);
Run Code Online (Sandbox Code Playgroud)
你可以尝试:
if (err) return reject(err);
Run Code Online (Sandbox Code Playgroud)
如果你真的想拒绝从create_section()函数返回的承诺。
您混合了三种异步控制流方式:回调、promise 和 async/await。您需要完全理解所有这些,才能毫无问题地将它们组合起来。
我建议编写一个包装器,为所有采用回调的函数返回承诺,如下所示:
const sectionCreate = (...args) => new Promise((resolve, reject) => {
DB.section.create(...args, (err, data) => {
if (err) {
return reject(err);
}
resolve data;
});
});
Run Code Online (Sandbox Code Playgroud)
(或者您可以使用 Bluebird 的 promisify),现在您可以轻松地在 async/await 流程中使用它:
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;
}
Run Code Online (Sandbox Code Playgroud)
这假设add_lessons()返回一个隐含的承诺,但您的代码可能并非如此。您可以await使用承诺,以便await在返回承诺的函数调用前使用。
请注意,每个async函数都会返回一个 promise,因此您无需明确地执行此操作。
| 归档时间: |
|
| 查看次数: |
8070 次 |
| 最近记录: |