节点js,如何在循环后运行代码同步

时间:2017-11-05 11:11:09

标签: javascript node.js mongodb

这是我的代码,我尝试更新我的数据库的一些文件(MongoDB) 使用for循环。但是我希望在循环完成后运行下一个代码, 例如,我想在完成后使用在循环内计算的一些变量。 我如何使用回调,承诺等来做到这一点?

numPktUpdated = 0;
for (key in InvoicesPUT) { 
      Invoice.findOneAndUpdate({ InvoiceNumber: InvoicesPUT[key].InvoiceNumber }, InvoicesPUT[key]).exec()
      .then((doc) => {
           console.log("Update Succeeded")
           numPktUpdated = numPktUpdated + 1;
      })
      .catch((err) => {
            return resp.send(JSON.stringify({
            "status": "error",
            "message": "DB Error while Updating: Wrong Packet"
            }));
            console.log(err);
     })
}
resp.send(numPktUpdated);

这里numPktUpdated = 0被发送到客户端,虽然它在循环之后的实际值是其他的。

感谢。

4 个答案:

答案 0 :(得分:1)

尝试将代码放入函数,然后使用async

运行它
    async function  forLoopFunction(args){//here is a for loop
    }

    let ret = await forLoopFunction(args);

答案 1 :(得分:1)

您应该可以使用Promise.all()

执行此操作
Promise.all(InvoicesPUT.map(InvoicePUT => {
    return Invoice.findOneAndUpdate({
        InvoiceNumber: InvoicePUT.InvoiceNumber
    }, InvoicePUT).exec()
    .then(doc => {
        console.log("Update Succeeded");
        numPktUpdated += 1;
    })
}))
.catch(err => {
    return resp.send(JSON.stringify({
        "status": "error",
        "message": "DB Error while Updating: Wrong Packet"
    }));
    console.log(err);
})
.then(() => {
    // What you want to do after the loop ...
})

答案 2 :(得分:0)

如果您使用的是较早版本的Node v7.6,它支持async / await模式,则可以使用简单的Promise

function updateDocs() {
    return new Promise(function(resolve, reject) {
        numPktUpdated = 0;
        for (key in InvoicesPUT) { 
              Invoice.findOneAndUpdate({ InvoiceNumber: InvoicesPUT[key].InvoiceNumber }, InvoicesPUT[key]).exec()
              .then((doc) => {
                   console.log("Update Succeeded")
                   numPktUpdated = numPktUpdated + 1;
                   resolve(numPktUpdated);
              })
              .catch((err) => {
                    console.log(err);
                    reject(err);
                    return resp.send(JSON.stringify({
                        "status": "error",
                        "message": "DB Error while Updating: Wrong Packet"
                    }));                    
             })
        }
    });
}


updateDocs().then(function(numPktUpdated) {
    resp.send(numPktUpdated);
})
.catch(function(err) {
    // handle error
});

答案 3 :(得分:0)

谢谢,它只是进行了一些小修改:

Promise.all(InvoicesPUT.map(invoice => {
                return Invoice.findOneAndUpdate({InvoiceNumber: invoice.InvoiceNumber}, invoice).exec()
                .then((doc) => {
                    console.log("Update Succeeded")
                    numPktUpdated = numPktUpdated + 1;
                })

            }))
            .catch((err) => {
                return resp.send(JSON.stringify({
                    "status": "error",
                    "message": "DB Error while Updating: Wrong Packet"
                }));
                console.log(err);
            })
            .then((resolve) => {
                return resp.send(JSON.stringify({
                    "status": "succed",
                    "LastSavedGUID": 654323,
                    "SyncDate": 1,
                    "pagenumber": numPktUpdated
                }));
            })