【问题标题】:How to use q promise in for loop如何在 for 循环中使用 q promise
【发布时间】:2019-01-07 18:44:24
【问题描述】:

当我在循环中使用 q promise 时遇到问题。结果展示

0

1

2

--

--

--

但我承诺的结果必须是:

0

--

1

--

2

--

有我的代码:

for(let i = 0; i < 3; i++) {
    let row     = planRespone[i];
    let planData    = {
        diary_id:diaryData.id,
        title:row.title
    };
    console.log(i);
    addDiaryPlan(planData)
    .then((insertId) => {
        console.log("--");
    })
    .catch((err) => {
        throw err;
    })
};

并支持它

let addDiaryDetail = (data) => {
  let q = Q.defer();
  Mdl.addDiaryDetail(data, function(err, result) {
      if(err) q.reject(err);
      else q.resolve(result);
  });
  return q.promise;
}

在这种情况下我该如何使用 Promise?

【问题讨论】:

  • 使用异步/等待。你可能根本不需要 Q 。 addDiaryDetail 可以通过 util.promisify 进行承诺。
  • 你可以使用来自异步库的each,这里是文档:caolan.github.io/async/docs.html#each
  • @giankotarola - Javascript 现在内置了 Promise,是用于管理异步操作的 Javascript 语言的未来。教人们如何使用它比旧的异步库做事方式要好得多。
  • @jfriend00 当然!我认为您是对的,但可能是一种选择,开发人员必须决定如何去做。
  • 使用 async-q 库中的每一个,这是异步库的承诺兼容版本:npmjs.com/package/async-q

标签: node.js asynchronous promise q


【解决方案1】:

正如其他人所说,我认为根本不需要 Q。您可以使用 node.js 内置功能 (util.promisify()) 来做到这一点。

如果您想按顺序运行for 循环,在进入循环的下一次迭代之前等待异步操作完成,那么async/await 是最简单的方法,因为它将暂停for 循环:

const util = require('util');
Mdl.addDiaryDetailPromise = util.promisify(Mdl.addDiaryDetail);

async function someFunction() {
    for (let i = 0; i < 3; i++) {
        let row = planRespone[i];
        let planData = {
            diary_id:diaryData.id,
            title:row.title
        };
        console.log(i);
        await Mdl.addDiaryPlanPromise(planData).then(insertId => {
            console.log("--");
        });
    };
}

// usage
someFunction().then(() => {
    console.log("all done");
}).catch(err => {
    console.log(err);
});

这应该会为您提供所需的输出序列。


注意,要使用await,它必须位于声明为async 的函数中,并且该函数将始终返回一个promise,该promise 在函数完成时解析或在出现某种未捕获的错误时拒绝函数(实际异常或被拒绝的等待)。

【讨论】:

  • 让我试试这个方法
猜你喜欢
  • 2017-07-25
  • 1970-01-01
  • 2014-10-15
  • 2020-07-27
  • 1970-01-01
  • 2016-12-13
  • 2014-01-28
  • 2015-07-31
  • 2018-07-03
相关资源
最近更新 更多