2016-02-12 88 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