我有一个集合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);
});
}
})
}
}
目前,它以异步方式工作,有任何好方法可以同步方式实现
答案 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*/
})
}