如何在for循环中使用q promise

时间:2018-07-31 11:21:21

标签: node.js asynchronous promise q

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

  

0

     

1

     

2

     

-

     

-

     

-

但是我保证的结果必须是:

  

0

     

-

     

1

     

-

     

2

     

-

有我的代码:

private let lock = NSRecursiveLock()

并支持它

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

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

1 个答案:

答案 0 :(得分:0)

正如其他人所说,我根本不需要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会在函数完成时解析或在某种排序时拒绝函数中未捕获的错误(实际异常或等待被拒绝)。