在继续下一次迭代之前,如何使循环等待db promise完成?

时间:2016-10-05 22:24:27

标签: javascript ajax

我目前正在使用node.js sequalize从数据库中提取数据,而在前端我正在使用ajax请求。所以我发送带有json对象的ajax请求来编辑数据库。但是当我尝试编辑数据库时,foor循环不会等到承诺在下一次迭代之前完成。我试图将promises发送到数组并使用Bluebird函数Promise.each但是promises在它们被发送到数组之前执行。我该怎么做才能在当前承诺完成之前暂停for循环?

for(var i=0; i<recordsJSON.length; i++)
{
    var recordJSON = recordsJSON[i];

    Record.nullPayeeId(recordJSON.id).then(function()
    {
        return Record.getOneRecord(recordJSON.id);
    })
    .then(function(record)
    {
        var virtualPayeeId = record.virtualPayeeId;
        return VirtualPayee.deletePayee(virtualPayeeId);
    })
    .then(function()
    {
        var category = parseInt(recordsJSON[i].category);
        var subcategory = parseInt(recordsJSON[i].subcategory);

        return VirtualPayee.insertPayee({
            payee: recordJSON.payee,
            description: recordJSON.description,
            categoryId:category,
            subcategoryId:subcategory
        })
    })
}

1 个答案:

答案 0 :(得分:2)

由于您的意思是Bluebird,您可以使用Promise.mapSeries()来帮助您序列化事物:

Promise.mapSeries(recordsJSON, function(recordJSON) {
    return Record.nullPayeeId(recordJSON.id).then(function () {
        return Record.getOneRecord(recordJSON.id);
    }).then(function(record) {
        var virtualPayeeId = record.virtualPayeeId;
        return VirtualPayee.deletePayee(virtualPayeeId);
    }).then(function() {
        var category = parseInt(recordJSON.category);
        var subcategory = parseInt(recordsSON.subcategory);

        return VirtualPayee.insertPayee({
            payee: recordJSON.payee,
            description: recordJSON.description,
            categoryId: category,
            subcategoryId: subcategory
        });
    });
}).then(function (results) {
    // results here in oder
}).catch(function (err) {
    // error here
});

如果您想手动序列化它们,那么您可能希望将.reduce()模式与您的承诺一起使用。你可以在这里阅读这个模式:

JavaScript: Perform a chain of promises synchronously

How to synchronize a sequence of promises?

Can Promise load multi urls in order?