Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/41.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 循环内的承诺_Javascript_Node.js_Mongoose - Fatal编程技术网

Javascript 循环内的承诺

Javascript 循环内的承诺,javascript,node.js,mongoose,Javascript,Node.js,Mongoose,忽略语法错误。我需要在聚合中使用i值执行一些操作,并需要更新它,但当我执行以下代码时,for循环不会等到更新完成。它迭代i值非常快,聚合跳过每个i值。我是javascript新手,所以,如果这个问题很愚蠢,我也很抱歉 model.countDocuments((err,count)=>{ for(i=value;i<count;i++){ console.log(i) model.aggregate({[//some update function]})

忽略语法错误。我需要在聚合中使用i值执行一些操作,并需要更新它,但当我执行以下代码时,for循环不会等到更新完成。它迭代i值非常快,聚合跳过每个i值。我是javascript新手,所以,如果这个问题很愚蠢,我也很抱歉

model.countDocuments((err,count)=>{    
for(i=value;i<count;i++){
     console.log(i)
     model.aggregate({[//some update function]})
     .then((res)=>model.update({field:something},{$set:res.value}}))
})
model.countDocuments((err,count)=>{
for(i=value;imodel.update({field:something},{$set:res.value}))
})

尝试使用异步/等待功能

将您的代码更改为此

model.countDocuments(async (err,count)=>{    
    for(i=value;i<count;i++){
         console.log(i);
         let res = await model.aggregate({[/*some update function]*/});
         model.update({field:something},{$set:res.value}});
    }
)
model.countDocuments(异步(err,count)=>{

对于(i=value;i尝试使用异步/等待功能

将您的代码更改为此

model.countDocuments(async (err,count)=>{    
    for(i=value;i<count;i++){
         console.log(i);
         let res = await model.aggregate({[/*some update function]*/});
         model.update({field:something},{$set:res.value}});
    }
)
model.countDocuments(异步(err,count)=>{
对于(i=value;i,您可以使用它来同时完成大部分工作,并且在所有工作完成后仍可以按照启动它们的相同顺序运行结果。下面是一个完全工作的示例,有点类似于您的问题

//生成一个介于250和500之间的随机值。用于设置超时的延迟
//模拟“长时间运行”操作。
常数延迟=()=>Math.floor(Math.random()*(500-250+1))+250;
//这表示model.aggregate函数。接受一个数字的输入
//为了在本例中进行关联,始终使用
//打算将其传递到下一个“then”
常量聚合=(i)=>{
返回新承诺((解决、拒绝)=>{
setTimeout(()=>{resolve(`[${i}]:聚合的`},delay());
});
};
//这表示您的model.update函数。为方便起见,需要一个数字
//相关性和“聚合”函数的结果。
常数更新=(i,res)=>{
//由聚合产生的结果
log(`[${i}]:${res}`);
返回新承诺((解决、拒绝)=>{
setTimeout(()=>{resolve(`[${i}]:更新的`},delay());
});
};
//一个生成数字数组的助手。只是一个“爱好者”的替代品
//“对于i=value;i,您可以使用它来同时完成大部分工作,并且在完成所有工作后,仍然可以按照启动它们的相同顺序运行结果。下面是一个完全有效的示例,有点类似于您的问题

//生成一个介于250和500之间的随机值。用于设置超时的延迟
//模拟“长时间运行”操作。
常数延迟=()=>Math.floor(Math.random()*(500-250+1))+250;
//这表示model.aggregate函数。接受一个数字的输入
//为了在本例中进行关联,始终使用
//打算将其传递到下一个“then”
常量聚合=(i)=>{
返回新承诺((解决、拒绝)=>{
setTimeout(()=>{resolve(`[${i}]:聚合的`},delay());
});
};
//这表示您的model.update函数。为方便起见,需要一个数字
//相关性和“聚合”函数的结果。
常数更新=(i,res)=>{
//由聚合产生的结果
log(`[${i}]:${res}`);
返回新承诺((解决、拒绝)=>{
setTimeout(()=>{resolve(`[${i}]:更新的`},delay());
});
};
//一个生成数字数组的助手。只是一个“爱好者”的替代品

//“对于i=value;值得补充的是,这对于需要回调的循环(如forEach、map等)不起作用。我非常怀疑它在arr.forEach(async(param)=>{//await statement})中是否起作用。”。这是一个法律声明。似乎我误解了您的意思。但也值得注意的是,forEach和map不是异步函数,它们将同步运行,而无需等待下一个函数。值得补充的是,这对需要回调的循环(如forEach、map等)不起作用。我高度怀疑它不会起作用t work arr.forEach(异步(param)=>{//await statement})。这是一个法律声明。似乎我误解了你。但也值得注意的是,forEach和map不是异步函数,它们将同步运行,而无需等待下一个函数。非常感谢你详细解释这些。现在我对承诺的工作原理有了清晰的了解。非常感谢你的帮助现在我对承诺的作用有了一个清晰的认识。