如何串行执行Promise?

44 阅读1分钟
# 如何串行执行Promise

## 方法1: 使用async/await循环

```javascript
async function executePromisesInSeries(promises) {
  const results = [];
  for (const promise of promises) {
    const result = await promise();
    results.push(result);
  }
  return results;
}

// 使用示例
const promiseFunctions = [
  () => new Promise(resolve => setTimeout(() => resolve(1), 1000)),
  () => new Promise(resolve => setTimeout(() => resolve(2), 500)),
  () => new Promise(resolve => setTimeout(() => resolve(3), 300))
];

executePromisesInSeries(promiseFunctions)
  .then(results => console.log(results)); // [1, 2, 3]

方法2: 使用reduce

function executePromisesInSeries(promises) {
  return promises.reduce((chain, currentPromise) => {
    return chain.then(chainResults => 
      currentPromise().then(currentResult => 
        [...chainResults, currentResult]
      )
    );
  }, Promise.resolve([]));
}

// 使用示例
const promiseFunctions = [
  () => new Promise(resolve => setTimeout(() => resolve('A'), 1000)),
  () => new Promise(resolve => setTimeout(() => resolve('B'), 500)),
  () => new Promise(resolve => setTimeout(() => resolve('C'), 300))
];

executePromisesInSeries(promiseFunctions)
  .then(results => console.log(results)); // ['A', 'B', 'C']

方法3: 递归实现

function executePromisesInSeries(promises, index = 0, results = []) {
  if (index >= promises.length) return Promise.resolve(results);
  
  return promises[index]()
    .then(result => {
      return executePromisesInSeries(promises, index + 1, [...results, result]);
    });
}

// 使用示例
const promiseFunctions = [
  () => new Promise(resolve => setTimeout(() => resolve('X'), 1000)),
  () => new Promise(resolve => setTimeout(() => resolve('Y'), 500)),
  () => new Promise(resolve => setTimeout(() => resolve('Z'), 300))
];

executePromisesInSeries(promiseFunctions)
  .then(results => console.log(results)); // ['X', 'Y', 'Z']

方法4: 使用for...of循环

async function executePromisesInSeries(promises) {
  const results = [];
  for (const promiseFunc of promises) {
    results.push(await promiseFunc());
  }
  return results;
}

// 使用示例
const promiseFunctions = [
  () => new Promise(resolve => setTimeout(() => resolve(10), 1000)),
  () => new Promise(resolve => setTimeout(() => resolve(20), 500)),
  () => new Promise(resolve => setTimeout(() => resolve(30), 300))
];

executePromisesInSeries(promiseFunctions)
  .then(results => console.log(results)); // [10, 20, 30]

方法5: 使用生成器函数

async function* promiseGenerator(promises) {
  for (const promise of promises) {
    yield await promise();
  }
}

async function executePromisesInSeries(promises) {
  const results = [];
  for await (const result of promiseGenerator(promises)) {
    results.push(result);
  }
  return results;
}

// 使用示例
const promiseFunctions = [
  () => new Promise(resolve => setTimeout(() => resolve('alpha'), 1000)),
  () => new Promise(resolve => setTimeout(() => resolve('beta'), 500)),
  () => new Promise(resolve => setTimeout(() => resolve('gamma'), 300))
];

executePromisesInSeries(promiseFunctions)
  .then(results => console.log(results)); // ['alpha', 'beta', 'gamma']

方法6: 使用Promise链

function executePromisesInSeries(promises) {
  let chain = Promise.resolve();
  const results = [];
  
  promises.forEach(promiseFunc => {
    chain = chain.then(() => 
      promiseFunc().then(result => results.push(result))
    );
  });
  
  return chain.then(() => results);
}

// 使用示例
const promiseFunctions = [
  () => new Promise(resolve => setTimeout(() => resolve(100), 1000)),
  () => new Promise(resolve => setTimeout(() => resolve(200), 500)),
  () => new Promise(resolve => setTimeout(() => resolve(300), 300))
];

executePromisesInSeries(promiseFunctions)
  .