CNode

es6 Promise 串行执行

分享
Llwcbest发布于8 年前最后回复8 年前8 回复5707 浏览0 收藏

并行执行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)

A
atian25#1·8 年前
C
cnwhy#2·8 年前

原生的.then就是串行的; 如果你的串行没有依赖关系,用bluebirdPromise.map 方法可以配置并发数; 也还可以试试我写的一个基于Promise的队列 promise-queue-plus

W
waitingsong#3·8 年前

简单的异步流控制用原生的或者第三方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$
 }
Z
zy445566#4·8 年前

https://github.com/zy445566/block-run 之前实现过,给你参考了,相同渠道串行执行

L
lwcbest#6·8 年前
引用 atian25https://github.com/sindresorhus/promise fun 你值得拥有

@atian25 我这1个方法是可以搞定了的

A
atian25#7·8 年前
引用 lwcbest@atian25 我这1个方法是可以搞定了的

@lwcbest 我只是分享下,已经有人写好了很多 lib,选一个适合的用就好了,它也是一个个的独立包的。

对我日常的使用场景来说,因为都有 await,直接一个 for 循环执行即可,如果是 node6 的话,就包个 co 。这样更直观。

F
fruit-memory#8·8 年前

for await of?

参与回复
登录后即可参与回复。登录