【问题标题】:Defining async function inside promise在 Promise 中定义异步函数
【发布时间】:2017-10-29 21:58:46
【问题描述】:

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

【问题讨论】:

标签: javascript node.js mongodb promise


【解决方案1】:

您将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 作为参数的函数,而不是一个本身名为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,如下所示:

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

(或者你可以使用 Bluebird 的承诺) 现在您可以轻松地在 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;
}

这假设 add_lessons() 返回一个隐含的承诺,但您的代码可能并非如此。您可以在 Promise 上使用 await,这样您就可以在返回 Promise 的函数调用前使用 await

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

【讨论】:

  • 谢谢你的帮助...你能给我推荐一些学习node.js的好材料吗...我知道node.js的基础知识,再次感谢...
  • @akashmodi 我可以推荐 Pedro Teixeira 的 Node Tuts,以便在 nodetuts.com 开始一个良好的开端,我推荐 CodeSchool:codeschool.com/courses/real-time-web-with-node-js 和 NodeSchool:nodeschool.io 以及 YouTube 上的许多优秀教程和讲座.祝你好运!
  • @akashmodi 也可以搜索 Domenic Denicola 关于 Promises 的演讲。
猜你喜欢
  • 2021-02-15
  • 2020-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-22
  • 2020-01-03
  • 2020-07-09
相关资源
最近更新 更多