按顺序执行承诺映射

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。

Cer*_*nce 7

您当前代码的问题在于Promise.prototype.mapforEach不等待在其中调用的异步函数完成。(除非您用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)