我使用Asana Node库在项目中创建一个包含一系列部分(任务)的新项目。我需要按特定顺序(同步)创建部分,以便它们在项目中以正确的顺序出现。如果我只是采用一系列节名称,然后使用forEach将它们添加为任务,它们不会以正确的顺序出现(因为这些是异步调用)。这是一个片段:
var sections = [ '预生产&#39 ;, '生产&#39 ;, '后期制作&#39 ;, '音频&#39 ;, '运动&#39 ;, '最终' ]。 sections.forEach(的buildSection);
我最终必须将一系列.then()调用串联在一起,每个部分一个,以便按正确的顺序构建它们。这显然是一种更好的方式,但我是承诺和蓝鸟的新手。谢谢你的帮助!
答案 0 :(得分:2)
请参阅Bluebird的Promise.reduce()
,对数据来自数组的一系列操作进行排序。
假设buildSection()
在完成后返回一个promise并将section name作为参数,你可以这样做:
var sections = [ 'Pre-Production', 'Production', 'Post-Production', 'Audio', 'Motion', 'Final' ];
Promise.reduce(sections, function(val, item) {
return buildSection(item);
}, 0).then(function(finalVal) {
// all are done here
});
蓝鸟Promise.reduce()
支持累积的value
Array.prototype.reduce()
。如果您不需要,可以使用Promise.each()
或Promise.map()
(并发设置为1
),具体取决于您可能需要的最终输出类型。