当前位置: 首页 > 知识库问答 >
问题:

在promise中定义异步函数

易骁
2023-03-14

我正在使用编写promise代码。然后现在,我决定使用wait/async编写它。我在promise中调用了一个函数add_,然后在中调用了另一个函数。然后是该函数的一部分。这是我使用的代码。然后

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

这是使用wait/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\u lessons是意外标识符。那么,告诉我如何在promise中定义异步函数?

共有1个答案

黄君博
2023-03-14

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

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

这样地:

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

只能在具有async关键字的函数中使用wait,而不能在具有async关键字的其他函数中的所有函数中使用。

但是,您应该传递给new Promise()构造函数的是一个函数,它将解决方案作为参数,而不是一个本身名为解决方案的函数。而不是这样:

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是隐含的,但您的代码可能不是这样。您可以在promise上使用wait,以便在返回promise的函数调用前使用wait

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

 类似资料:
  • 我试图利用es7异步功能,即。 在这里,所有promise*函数都进行ajax调用,并返回或如果ajax响应满足传递的参数,我相信我不能连续使用3个等待,因此需要一种方法来等待所有这些调用以某种方式返回它们的值。

  • 我真的需要温习一下我的异步等待和promise。我想要一些建议。 我正在对firebase firestore进行异步函数调用。函数应根据单个输入参数返回字符串。 该功能适用于1-1用户聊天。该功能是创建聊天/查找现有聊天,并返回其ID。 现在,我得到的作为返回值的和不知道为什么。除了返回之外,该函数还能正常工作。 我有两个功能。一个是React类组件生命周期方法,另一个是我的firebase异步

  • 问题内容: 我不确定node.js如何在异步中实现哪些功能,在异步中没有实现的功能以及如何创建自定义异步功能。 说我想创建一个自定义的异步函数。如果只是因为我对异步函数回调或cb调用了我的最后一个参数而只知道其异步函数,我会感到惊讶: 我尝试了类似的方法,但它无法异步运行。您如何告诉node.js f实际上是异步的? 问题答案: 注意 :此答案写于2014年,在出现之前,在Promises流行之前

  • 我看了类似的问题,没有找到一个解决方案,我可以实现到我自己的代码,因此我做了这篇文章。我有以下代码: 最后一个console.log返回undefined,尽管pool.query中的console日志提供了我要查找的正确字符串。我尝试过的这段代码的另一个版本给出了暂挂的promise,而不是未定义的promise。 通过阅读其他文章,我理解这是因为我没有将wait与async函数一起使用。问题是

  • 我试图理解promise、回调等在node.js中是如何工作的,特别是在访问函数之外的值的情况下。我花了一些时间在这里浏览答案如何从异步调用返回响应?在这里调用条纹API等待,但我尝试的每一个变化,我总是以'订阅'函数之外未定义结束。 谢啦

  • 我有一个异步块: 我可以跟踪成功和失败的结果。但是,是否可以重试整个chain?然后继续重试,直到问题解决?