Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在node js(Express js)中将for循环回调转换为sync_Javascript_Node.js_Mongodb_Express_Asynchronous - Fatal编程技术网

Javascript 如何在node js(Express js)中将for循环回调转换为sync

Javascript 如何在node js(Express js)中将for循环回调转换为sync,javascript,node.js,mongodb,express,asynchronous,Javascript,Node.js,Mongodb,Express,Asynchronous,我有一个像[123426789]这样的集合对象数组 我需要编写一个for循环,从集合中找到该对象,并对每个对象执行一些操作,目前,我编写的代码如下 let obj = ["5acf60d327cca60880b4a257", "5a9e3c642b6b04387208b24c", "5acf60ab27cca60880b4a252"]; for(let i =0; i<=obj.lenth;i++){ if(i=== obj.length){ return call

我有一个像[123426789]这样的集合对象数组 我需要编写一个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 Yes you can. Make your callback to return a promise and then you can 
await
in for loop for that to be resolved and rest of the loop code will be executed after the callback has been resolved.

This is the way to go

(async function(){
 for(let i =0; i<=obj.lenth;i++){
   if(i=== obj.length){
      await callback1(params)
   }else{
      await callback2(params)
   }
})();
让obj=[“5acf60d327cca60880b4a257”、“5a9e3c642b6b04387208b24c”、“5acf60ab27cca60880b4a252”];
for(设i=0;i{
如果(错误){
console.log(“未找到用户”);
}否则{
发送邮件({

from:'“Fred Foo是的,您可以。进行回调以返回承诺,然后您可以
在for循环中等待
以解决该问题,其余的循环代码将在回调解决后执行

这就是路

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*/
 })
}

onsole.log('messagesent:%s',error);
应该是
console.log('messagesent:%s',error);
(只是旁注)更好的方法是:保持您的请求异步,但要有序。例如,不要一次启动所有请求,而是让第一个请求的结果回调触发第二个请求,等等。这是一个看起来很奇怪的代码:)您基本上是在对象上循环,创建多个异步调用,并且在循环结束时(由i===obj.length触发)您正在调用回调…为什么不在迭代到.exec()
已经返回了一个
承诺
:OP可能更容易在他的代码中实现,但必须记住,其效果类似于同步行为。只要请求未完成,javascript引擎实际上就会陷入for循环,可能会对用户与UI的交互产生副作用