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。所以,我想使用承诺。