【发布时间】:2017-04-03 00:53:12
【问题描述】:
不使用任何额外的库(async、bluebird 等) 我正在尝试实现一个函数,该函数返回一个基于返回 Promise 的函数数组的 Promise 解析(或拒绝)输入参数...Promise.all(iterable) 与我尝试完成的功能非常相似,但 Promise.all 的 iterable 参数中的承诺不按顺序执行。
我可以简单地将这些函数链接在一起,但是如果functionList是一个未知长度的列表...
我已经尝试在概念上展示我想要在下面完成的工作:
function foo() {
return new Promise((resolve, reject) => {
setTimeout( () => {
return resolve();
}, 200);
})
}
function bar() {
return new Promise((resolve, reject) => {
setTimeout( () => {
return resolve();
}, 200);
})
}
function baz() {
return new Promise((resolve, reject) => {
setTimeout( () => {
return reject();
}, 100);
})
}
const functionList = [foo, bar, baz];
function promiseSeries(functionList){
const results = [];
return new Promise((resolve, reject) => {
promiseList.map((promise, i) => {
return new Promise((_resolve, _reject) => {
promise()
.then((result) => {
results.push(result);
if (i === promiseList.length - 1) {
return resolve(results);
}
else return _resolve();
})
.catch(error => error)
})
})
})
}
显然在 functionList 上运行 Promise.all 我们会看到 baz(即使它的位置是 functionList[2] 首先解析)
Resolve promises one after another (i.e. in sequence)? 或 Running promises in small concurrent batches (no more than X at a time) 均未提供此问题的答案。我不想导入一个库来处理这个单一的实用函数,而且我只是好奇这个函数会是什么样子。
【问题讨论】:
-
没有任何其他库,你需要为此做一个递归,因为你需要等待一个承诺完成,一个例子(对不起,也可以作为评论发布): const recurse = ( promiseList) => { if (promiseList.length > 0) { promiseList[0]().then(v => recurse(promiseList.splice(1, promiseList.length)) } }
-
jsfiddle.net/jbnhLtvk/2 应该会给你这个想法。基本上,你需要等待一个promise完成,然后调用递归函数但没有数组的头部,所以最后数组将为空,函数将终止。
-
这里更新了,jsfiddle.net/jbnhLtvk/4
-
目前有一个关于堆栈溢出的类似问题,但它在外部依赖的上下文中与这个问题有关。那会是什么问题?
标签: javascript node.js promise