如何在拒绝时打破 Bluebird promise.app()?
How do I break a Bluebird promise.app() on a reject?
我正在编写一个 MongoDB 索引器并使用 Bluebird 作为我的承诺,当我想提交一组索引时它工作正常。
我的问题是,如果其中一个承诺被拒绝(即第一个),其余索引仍会被调用。我想停止执行失败后的任何内容。
var arr = [{col1: 1}, {col2: 1}];
return bluebird.all(arr.map(function (index) {
// This returns a promise
return indexingFunction(index);
}));
您可以使用 .each()
:
return bluebird.each(arr, function(item) {
return indexingFunction(item);
});
首先,您必须决定是运行并行还是顺序执行所有异步操作。如果您并行启动所有操作,那么所有请求都会立即启动,即使第一个请求失败,其他请求也已发送,因此您无法阻止它们发送。
如果您 运行 您的异步操作按顺序发出一个请求,并且只有在收到该响应后才 运行 下一个请求,那么您可以停止任何后续操作失败时发送。
您问题中的代码正在并行启动所有请求,因为 arr.map()
是同步的(它 运行 同时通过整个数组)。因此,当第一个响应返回时,所有其他请求都已发送,因此您无法阻止它们。
您可以通过多种方式对数组中的项目进行排序。适用于所有 Promise 库的一种常见设计模式是使用 .reduce()
:
var arr = [{col1: 1}, {col2: 1}];
arr.reduce(function(p, val) {
return p.then(function() {
return indexingFunction(val);
});
}, Promise.resolve(result)).then(function() {
// all finished successfully
}, function(err) {
// finished with err
});
Bluebird 还内置了一些用于处理集合的函数:
Promise.map(arr, function(val) {
return indexingFunction(val);
}, {concurrency: 1}).all().then(function(results) {
// all results here
}, function(err) {
// error here
});
仅供参考,您可能还想看到这个:ES6 Promises - something like async.each?
我正在编写一个 MongoDB 索引器并使用 Bluebird 作为我的承诺,当我想提交一组索引时它工作正常。
我的问题是,如果其中一个承诺被拒绝(即第一个),其余索引仍会被调用。我想停止执行失败后的任何内容。
var arr = [{col1: 1}, {col2: 1}];
return bluebird.all(arr.map(function (index) {
// This returns a promise
return indexingFunction(index);
}));
您可以使用 .each()
:
return bluebird.each(arr, function(item) {
return indexingFunction(item);
});
首先,您必须决定是运行并行还是顺序执行所有异步操作。如果您并行启动所有操作,那么所有请求都会立即启动,即使第一个请求失败,其他请求也已发送,因此您无法阻止它们发送。
如果您 运行 您的异步操作按顺序发出一个请求,并且只有在收到该响应后才 运行 下一个请求,那么您可以停止任何后续操作失败时发送。
您问题中的代码正在并行启动所有请求,因为 arr.map()
是同步的(它 运行 同时通过整个数组)。因此,当第一个响应返回时,所有其他请求都已发送,因此您无法阻止它们。
您可以通过多种方式对数组中的项目进行排序。适用于所有 Promise 库的一种常见设计模式是使用 .reduce()
:
var arr = [{col1: 1}, {col2: 1}];
arr.reduce(function(p, val) {
return p.then(function() {
return indexingFunction(val);
});
}, Promise.resolve(result)).then(function() {
// all finished successfully
}, function(err) {
// finished with err
});
Bluebird 还内置了一些用于处理集合的函数:
Promise.map(arr, function(val) {
return indexingFunction(val);
}, {concurrency: 1}).all().then(function(results) {
// all results here
}, function(err) {
// error here
});
仅供参考,您可能还想看到这个:ES6 Promises - something like async.each?