# 如何串行执行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));
方法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));
方法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));
方法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));
方法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)
.