use*_*691 6 javascript node.js promise
我编写了一个在循环(映射)中调用的函数,并且该函数使用了 Promise。现在,我希望该函数同步运行并在调用其下一个实例之前退出。
function t1(){
let arr1 = [1,2,3,4,5];
return Promise.map(arr1, (val) =>{
const params = {
"param1" : val1
};
return t2(params);
});
}
function t2(event){
return Promise.resolve()
.then({
//do something
//code doesn't reach here in sync manner. all five instance are invoked and then code reaches here for first instance and so on
})
.then({
//promise chaining. do something more
})
}Run Code Online (Sandbox Code Playgroud)
t2 被调用五次,但我希望每个实例只在实例返回值之前调用。目前它的行为不是那样,而是并行调用该函数五次。
由于项目限制,我无法使用 async/await。
您当前代码的问题在于Promise.prototype.map,forEach不等待在其中调用的异步函数完成。(除非您用await或明确告诉解释器这样做,否则不会等待异步调用.then)
有t1AWAIT的每个呼叫t2:
async function t1(){
let arr1 = [1,2,3,4,5];
const results = [];
for (const val of arr1) {
results.push(await t2(val));
}
return results;
}
Run Code Online (Sandbox Code Playgroud)
或者,如果您想使用reduce代替async/ await:
async function t1(){
let arr1 = [1,2,3,4,5];
const results = [];
for (const val of arr1) {
results.push(await t2(val));
}
return results;
}
Run Code Online (Sandbox Code Playgroud)
或者,如果您需要将顺序功能封装在 t2 中,那么让 t2 具有它生成的前一个 Promise 的半持久变量:
const delay = () => new Promise(res => setTimeout(res, 500));
function t1(){
let arr1 = [1,2,3,4,5];
return arr1.reduce((lastProm, val) => lastProm.then(
(resultArrSoFar) => t2(val)
.then(result => [...resultArrSoFar, result])
), Promise.resolve([]));
}
function t2(event){
return delay().then(() => {
console.log('iter');
return event;
});
}
t1()
.then(results => console.log('end t1', results));Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2785 次 |
| 最近记录: |