如何在节点js中将for循环回调转换为同步(Express js)

时间:2018-04-20 13:13:38

标签: javascript node.js mongodb express asynchronous

我有一个集合object_id的数组,如[123,426,789] 我需要编写一个for循环来从集合中找到该对象到每个对象的一些操作,目前,我的编码就像

let obj = ["5acf60d327cca60880b4a257", "5a9e3c642b6b04387208b24c", "5acf60ab27cca60880b4a252"];
for(let i =0; i<=obj.lenth;i++){
    if(i=== obj.length){
        return callback({
            code : 200,
            status: 'sucess',
            message: "Mail Requested Sucessfully"
        });
    }else{
        user.findbyId(obj[i]).exec((err, userData) => {
            if(err){
                console.log("user not found");
            }else{
                transporter.sendMail({
                    from: '"Fred Foo " <foo@example.com>', // sender address
                    to: userData.emailID, // list of receivers
                    subject: 'Hello ✔', // Subject line
                    html: '<b>Hello world?</b>' // html body
                }, (error, info) => {
                    if (error) {
                        onsole.log('Message sent: %s', error);
                    }
                    console.log('Message sent:', info);
                });
            }
        })
    }
} 

目前,它以异步方式工作,有任何好方法可以同步方式实现

1 个答案:

答案 0 :(得分:0)

是的,你可以。让你的回调函数返回一个promise,然后你可以在for循环中await来解决它,并且在回调被解析之后将执行其余的循环代码。

这是要走的路

(async function(){
 for(let i =0; i<=obj.lenth;i++){
   if(i=== obj.length){
      await callback1(params)
   }else{
      await callback2(params)
   }
})();

在某些承诺中定义您的user.findbyId(obj[i]).exec((err, userData)

这样的东西
function callback2(params){
    return new Promise((resolve,reject)=>{
      user.findbyId(obj[i]).exec((err, userData) => {
        if(err){
            resolve (error)
        }else{ /*send message and resolve promise*/
 })
}