执行一系列 Javascript 承诺一个接一个地解决
Execute an array of Javascript promises one after one resolved
我想知道是否有一种方法可以水法执行一系列承诺?即我希望下一个承诺在当前承诺得到解决之前不要开始。
我的测试:
import Promise from 'bluebird'
describe('promises waterfall', () => {
const result = []
function doItLater(val, time = 50) => {
return new Promise(resolve => {
setTimeout(() => {
result.push(val)
resolve(val)
}, time)
})
}
it('execute promises one after one resolved', done => {
result.push(1)
const promiseList = [doItLater('a', 100),doItLater('b', 1),doItLater('c')]
result.push(2)
Promise.each(
promiseList,
(output) => {
result.push(output + '-outputted')
}
)
.then(
() => {
result.push(3)
console.log(result)
expect(result).to.eql([ 1, 2, 'a', 'b', 'c', 'a-outputted', 'b-outputted', 'c-outputted', 3 ])
done()
}
)
})
})
更新
对不起,如果我把它弄得太混乱了。我在问我怎样才能让我的测试通过。目前我的测试失败 - 实际结果顺序错误:
[ 1,
2,
'b',
'c',
'a',
'a-outputted',
'b-outputted',
'c-outputted',
3 ]
当你创建这样的承诺时
[doItLater('a', 100),doItLater('b', 1),doItLater('c')]
它们已经在异步执行。没有办法控制它们的执行顺序。
您可以将Promise.reduce
用于您的案例,如下所示
Promise.reduce([['a', 100], ['b', 1], ['c']], function(res, args) {
return doItLater.apply(null, args).then(function(output) {
res.push(output + '-outputted');
return res;
});
}, result)
.then(function(accumulatedResult) {
....
});
现在,我们正在一个接一个地创建承诺,在解决上一个的承诺之后,我们将结果累积在res
(实际上是result
)。当所有承诺都解决后,accumulatedResult
将具有所有值。
注意:强烈建议不要在函数之间共享数据。如果必须这样做,请确保您有令人信服的理由这样做。
// Promisse waterfall pattern
var promises = [1,2,3].map((guid)=>{
return (param)=> {
console.log("param", param);
var id = guid;
return new Promise(resolve => {
// resolve in a random amount of time
setTimeout(function () {
resolve(id);
}, (Math.random() * 1.5 | 0) * 1000);
});
}
}).reduce(function (acc, curr, index) {
return acc.then(function (res) {
return curr(res[index-1]).then(function (result) {
console.log("result", result);
res.push(result);
return res;
});
});
}, Promise.resolve([]));
promises.then(console.log);
相关文章:
- iPad虚拟键盘-哪一个-javasctript解决方案
- 如何让我的网站上的WEBP图像加载在morzilla firefox中有一个可能的解决方案吗?如果是,那么如何
- 这里有一个更优雅的/DRY/可维护的JS解决方案
- 当我想发布一个变量但有 1 个 js 时,ajax post 的解决方案是什么
- 执行一系列 Javascript 承诺一个接一个地解决
- 我需要帮助来解决一个小问题
- 在jQuery中,.state()如何确定一个承诺是挂起的、已解决的还是被拒绝的
- 有没有一个简单的解决方案可以根据3个数据找到结果
- java脚本我需要帮助来解决一个问题
- 得到一个“无法读取未定义的属性'myVar'”,即使使用 typeof 也无法解决
- 将复杂内容(想想整个网页树)从一个 Web 应用程序提供给另一个网站的最佳可重用解决方案是什么?
- 需要一个类似于“另存为”对话框的解决方案来使用 javascript 选择文件名和位置
- 淡出/淡出使DIV's堆叠而不是重叠?使用& # 39;绝对# 39;这不是一个解决方案
- 使用AngularJS立即返回一个解决了的承诺
- 如果节点模块' body-parser '不安全,下一个解决方案是什么
- 需要一个解决方案,以增加减少字体大小的网站
- 需要一个解决方案,以阻止Safari浏览器阻止Facebook身份验证弹出框,允许用户登录到我的网站
- 为什么我的解决方案有效,而另一个解决方案无效
- 是否有一个解决方案,以获得对象直接到指令范围
- 寻找一个解决方案,作为radiobutton.click()挂Safari,但在Chrome中工作