es6 Promise 串行执行
发布于 6 年前 作者 lwcbest 4788 次浏览 来自 分享

并行执行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就是串行的; 如果你的串行没有依赖关系,用bluebirdPromise.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 。这样更直观。

回到顶部