javascript - 在 promise 中定义异步函数

标签 javascript node.js mongodb promise

我正在使用 .then 为 promise 编写代码。现在,我决定使用 await/async 来编写它。我在 promise 中调用了一个函数 add_Lessons,然后在该函数的 .then 中调用了另一个函数。这是我使用 .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 中定义异步函数?

最佳答案

您将 async 放在错误的函数前面。这个函数应该是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 作为参数的函数,而不是一个本身名为 的函数解决。而不是这个:

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 。

您正在混合异步控制流的三种方式:回调、 promise 和异步/等待。您需要完全理解所有这些才能毫无问题地组合它们。

我建议编写一个包装器,为所有接受回调的函数返回 promise ,如下所示:

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

(或者您可以为此使用 Bluebird 的 promisify) 现在您将能够轻松地在异步/等待流程中使用它:

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() 返回一个隐含的 promise ,但您的代码可能并非如此。您可以对 promise await,这样您就可以在返回 promise 的函数调用前使用 await

请注意,每个 async 函数都会返回一个 promise,因此您无需显式执行。

关于javascript - 在 promise 中定义异步函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44245082/

相关文章:

javascript - 使用下拉列表按名称排序

javascript - JavaScript无法使用attr更改图像

javascript - 如何在 node.js 中发送带有数据和不记名授权的 POST 请求?

node.js - 如何在nodejs中解码deflate字符串?

MongoDB:无条件更新?

javascript - 带有 webpack 的 Intl.js polyfill/shim?

javascript - 思维扭曲暗示 this.var 访问

javascript - Vue.js 可以使用 node-coap 库吗?

java - 在 Spring Data MongoDB 中使用 List 参数进行存储库查询

ruby-on-rails - Mongoid 和 Rails 的字段别名