首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >内部定义异步函数

内部定义异步函数
EN

Stack Overflow用户
提问于 2017-05-29 14:38:00
回答 2查看 10.6K关注 0票数 5

我正在使用.then为承诺编写代码。现在,我决定使用等待/异步编写它。我已经调用了一个函数,,add_Lessons,,in,然后调用该函数的.then中的另一个函数。下面是我使用.then编写的代码。

代码语言:javascript
复制
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.的代码

代码语言:javascript
复制
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);
        });
    }
);
};

使用等待/异步的代码显示了一个错误,即add_lessons是意外标识符。那么,告诉我如何定义异步函数的内部承诺?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-05-29 15:26:46

您将async置于错误的函数前面。这个函数应该是async

代码语言:javascript
复制
DB.section.create(s_obj,function (err, data_s) 

就像这样:

代码语言:javascript
复制
DB.section.create(s_obj, async function (err, data_s)

您只能在一个具有async关键字的函数中使用async--而不是在包含async关键字的其他函数中使用所有函数。

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

代码语言:javascript
复制
return new Promise(
    async function resolve() {

你应该使用这样的方法:

代码语言:javascript
复制
return new Promise(function (resolve, reject) {

此外,您可能还应该运行reject而不是next(error) -所以,而不是:

代码语言:javascript
复制
if (err) return next(err);

你可以尝试:

代码语言:javascript
复制
if (err) return reject(err);

如果您实际上想拒绝从create_section()函数返回的承诺。

您正在混合三种异步控制流方式:回调、承诺和异步/等待。你需要充分理解它们,才能毫无问题地将它们结合起来。

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

代码语言:javascript
复制
const sectionCreate = (...args) => new Promise((resolve, reject) => {
  DB.section.create(...args, (err, data) => {
    if (err) {
      return reject(err);
    }
    resolve data;
  });
});

(也可以为此使用Bluebird的promisify ),现在您可以在异步/等待流中轻松地使用它:

代码语言:javascript
复制
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函数都返回一个承诺,因此不需要显式地执行它。

票数 8
EN

Stack Overflow用户

发布于 2022-03-26 12:34:22

代码语言:javascript
复制
const getData = new Promise(async (res, rej) => {
    try {
      const response = await fetch("https://jsonplaceholder.typicode.co2m/todos/1");
      if (!response.ok) {
        return rej("Error while fetch");
      }
      const data = await response.json();
      return res(data);
    } catch (error) {
      return rej(error);
    } 
});

getData
.then(data=>console.log(data))
.catch(err=>console.log(err));
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44245082

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档