如何在for循环中使用q promise

How to use q promise in for loop

我在循环中使用 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。您可以使用 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 的函数内,并且该函数将始终 return 一个在函数完成时解析的承诺或在函数中存在某种未捕获的错误时拒绝(实际异常或拒绝等待)。