Javascript Node.js foreach+;承诺
我想打印Javascript Node.js foreach+;承诺,javascript,node.js,promise,Javascript,Node.js,Promise,我想打印arr=[1,2,3,4]如下 一, 101 2. 102 3. 103 4. 104 但结果如下 一, 2. 3. 4. 101 102 103 104 我的代码 var arr = [1, 2, 3, 4]; var promises = []; arr.forEach(function(elem){ print(elem) .then(addAndPrint) } ) function print(elem){ return new Promi
arr=[1,2,3,4]
如下
一,
101
2.
102
3.
103
4.
104
但结果如下
一,
2.
3.
4.
101
102
103
104
我的代码
var arr = [1, 2, 3, 4];
var promises = [];
arr.forEach(function(elem){
print(elem)
.then(addAndPrint)
}
)
function print(elem){
return new Promise(function(resolve, reject){
console.log(elem);
resolve(elem);
});
}
function addAndPrint(elem){
console.log(elem + 100);
}
我如何才能得到我想要的结果?我不确定您使用的约束条件是什么,但选择使用承诺可能需要一些解释。因为最简单的解决办法可能是不使用承诺。承诺适用于异步操作,但这里的一切都是同步的
var-arr=[1,2,3,4];
arr.forEach(功能(要素){
打印(elem)
添加和打印(elem);
});
功能打印(elem){
控制台日志(elem);
}
功能添加和打印(elem){
控制台日志(elem+100);
}
。然后
s异步执行(类似于设置超时(..,0)
)(即使承诺立即解决),而新承诺中的承诺创建功能((res,rej)=>{
同步运行。因此,如果在主线程结束之前同步创建一组承诺,例如使用forEach
,那么这些承诺的块将在任何到达之前立即运行
使用wait
和reduce
或for..of
确保迭代以串行方式运行,而不是并行方式运行:
var-arr=[1,2,3,4];
var承诺=[];
arr.reduce(异步函数(lastPromise,elem){
等待最后的承诺;
返回打印(elem)
.然后(添加和打印)
},Promise.resolve())
功能打印(elem){
返回新承诺(功能(解决、拒绝){
控制台日志(elem);
解决(elem);
});
}
功能添加和打印(elem){
控制台日志(elem+100);
}
。那么
只能保证您的addAndPrint(1)
方法在print(1)
方法之后执行,但不能在addAndPrint(1)之后执行print(2)
您需要每次迭代都等待上一次迭代完成以获得tht输出…因此,请使用承诺链接-例如let promise=promise.resolve();arr.forEach(function(elem){promise=promise.then(()=>printt(elem).then(addAndPrint));})
为什么你在这里写承诺。你可以用完全同步的方式来做。这是我的示例代码。实际上,我应该在add和print部分使用request。所以,我想使用承诺。