-
Notifications
You must be signed in to change notification settings - Fork 0
/
runPromiseInSequence.js
43 lines (38 loc) · 1.29 KB
/
runPromiseInSequence.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
/**
* promises确定是promise类型数组
*/
function runPromiseInSequence (promises, input) {
return promises.reduce((previous, current) => {
return previous.then(current)
}, Promise.resolve(input))
}
/**
* 对一起进行promise顺序执行
* 如果你有一堆异步或普通函数都返回 promise,要求你一个接一个地执行,这个工具就会很有用。
* 它会获取函数或 promise 列表,并使用数组 reduce 方法按顺序解析它们。
*/
const asyncSequentializer = (() => {
const toPromise = (x) => {
if (x instanceof Promise) { // if promise just return it
return x
}
if (typeof x === 'function') {
// if function is not async this will turn its result into a promise
// if it is async this will await for the result
return (async () => await x())()
}
return Promise.resolve(x)
}
return (list) => {
const results = []
return list
.reduce((lastPromise, currentPromise) => {
return lastPromise.then(res => {
results.push(res) // collect the results
return toPromise(currentPromise)
})
}, toPromise(list.shift()))
// collect the final result and return the array of results as resolved promise
.then(res => Promise.resolve([...results, res]))
}
})()