当所有使用 bluebirdjs 完成后,我如何顺序链接承诺并获得结果?
How can I sequentially chain promises and get result when all finished using bluebirdjs?
已经有人问过类似的问题here,但我很感兴趣,当所有的承诺完成时如何得到结果。
在我的代码中,我正在将文件安装到设备 - 这需要按顺序完成,并且 install 创建了一个承诺。
受上述示例和 example from BluebirdJS documentation 的启发,我编写了以下代码:
Promise.each(files, function(file, index){
self.adbClient.install(device, file.path)
.then(function() {
console.log('%s installed on device %s', file.name, device)
})
.catch(function(err) {
console.error('Something went wrong when installing %s on %s: '+ err.stack, file.name, device)
})
}).then(function() { console.log("All done"); })
.catch(function(err) { console.log("Argh, broken: " + err.message); })
执行后我得到:
All done
first-file.apk installed on device LGV400d1d1a81d
second-file.apk installed on device LGV400d1d1a81d
如何在所有安装完成后收到 All done 消息?
根据正确的文档http://bluebirdjs.com/docs/api/promise.each.html -
If the iterator function returns a promise or a thenable, then the result of the promise is awaited before continuing with next iteration
所以,添加一个 return
的简单情况如下
Promise.each(files, function(file, index){
return self.adbClient.install(device, file.path)
// ^^^^^^
// rest of your code
已经有人问过类似的问题here,但我很感兴趣,当所有的承诺完成时如何得到结果。
在我的代码中,我正在将文件安装到设备 - 这需要按顺序完成,并且 install 创建了一个承诺。
受上述示例和 example from BluebirdJS documentation 的启发,我编写了以下代码:
Promise.each(files, function(file, index){
self.adbClient.install(device, file.path)
.then(function() {
console.log('%s installed on device %s', file.name, device)
})
.catch(function(err) {
console.error('Something went wrong when installing %s on %s: '+ err.stack, file.name, device)
})
}).then(function() { console.log("All done"); })
.catch(function(err) { console.log("Argh, broken: " + err.message); })
执行后我得到:
All done
first-file.apk installed on device LGV400d1d1a81d
second-file.apk installed on device LGV400d1d1a81d
如何在所有安装完成后收到 All done 消息?
根据正确的文档http://bluebirdjs.com/docs/api/promise.each.html -
If the iterator function returns a promise or a thenable, then the result of the promise is awaited before continuing with next iteration
所以,添加一个 return
的简单情况如下
Promise.each(files, function(file, index){
return self.adbClient.install(device, file.path)
// ^^^^^^
// rest of your code