es6 Promise 串行执行
并行执行Promise.all() 那么串行怎么写? 直接上代码:
const promisesFuncs = [promise1,promise2,...];
const computeSinglePromise = function (promisesFuncs, initParams) {
let resultsArray = [];
return promiseFuncs.reduce((promise, fn, index) => {
console.log("reduce start", index);
return promise.then((result) => {
resultsArray.push(result);
return fn(result);
});
}, Promise.resolve(initParams))
.then(() => {
return resultsArray;
});
};
8 回复
原生的.then
就是串行的;
如果你的串行没有依赖关系,用bluebird
吧 Promise.map 方法可以配置并发数;
也还可以试试我写的一个基于Promise的队列 promise-queue-plus
简单的异步流控制用原生的或者第三方promise插件,复杂的就上异步流大杀器 rxjs
大致思路供参考
const combinePromiseObb = function (promisesFuncs, initParams) {
const { defer, from } = rxjs
const { scan } = rxjs.operators
const ret$ = from(promisesFuncs).pipe(
scan((acc, curr) => {
return defer(() => curr(acc))
}, initParams),
)
return ret$
}
rxjs 的逻辑清晰多了
可对结果数据处理
const combinePromiseObb = function (promisesFuncs, initParams) {
const { defer, from } = rxjs
const { map, scan } = rxjs.operators
const ret$ = from(promisesFuncs).pipe(
scan((acc, curr) => {
return defer(() => curr(acc))
// 可以在这儿对结果数据进行转换、变形、过滤
.pipe(
map(res => res + 1),
)
}, initParams),
)
return ret$
}
https://github.com/zy445566/block-run 之前实现过,给你参考了,相同渠道串行执行
@cnwhy 感谢, 原生的then确实是串行,但是我读100个文件不能去写100个then啊
@atian25 我这1个方法是可以搞定了的
@lwcbest 我只是分享下,已经有人写好了很多 lib,选一个适合的用就好了,它也是一个个的独立包的。
对我日常的使用场景来说,因为都有 await,直接一个 for 循环执行即可,如果是 node6 的话,就包个 co 。这样更直观。
for await of?