2016-02-12 65 views
1

我使用Bluebird 3启用取消。是取消该工具在下面的用例使用:取消Promise.map中的承诺(如果有人被拒绝)(Bluebird 3)

var resourcesPromise = Promise.map(resourceIds, function(id) { 
    return loadResource(id); 
}); 

resourcesPromise.catch(function() { 
    resourcesPromise.cancel(); 
});` 

如果其中的一个资源加载失败,resourcesPromise将被拒绝了,我想停止所有其他资源的加载。但据我所知,取消resourcesPromise不起作用,因为它已被拒绝。

编辑:我目前正在考虑以下的变体:(!我可能已经找到了一个合法使用“于是(解析,拒绝)”反模式)

var resourcesPromise = new Promise(function(resolve, reject) { 
    var intermediatePromise = Promise.map(resourceIds, function(id) { 
     return loadResource(id).catch(function(error) { 
      intermediatePromise.cancel(); 
      reject(error); 
     }); 
    }).then(resolve, reject); 
}); 

为什么Promise.map不能像那样工作?

回答

0

随着你的并行化资源加载地图,也许是更好地使用Promise.each到laoad资源序列。在这种情况下,您不需要取消承诺,以便在发生故障时停止加载剩余资源。

var resourcesPromise = Promise.map(resourceIds, function(id) { 
    return loadResource(id); 
}); 

resourcesPromise.catch(function() { 
    resourcesPromise.cancel(); 
});` 

另一种选择是要传递给地图功能的选项对象一样,可以在其中指定并发限制。

Promise.resolve(resourceIds). 
map(function(id) { 
    return loadResource(id); 
}, {concurrency: n}). 
catch(function(e) { 
    //do some error handling 
}); 
+1

我故意平行化资​​源加载,以使其更快。谢谢你的回答,但这对我不起作用。 – trkjgrdg