在angualarJs或node.js中替代q.all
是否有任何替代q.all
因为callback
只有当所有http调用成功时, q.all().then()
才会被调用。
即使一个http调用失败,也会进入.catch
部分。
有什么办法可以使它进入到q.all().then()
部分,即使很less的http调用失败?
如果你真的在谈论Q
库,那么Q.allSettled()
就是为了这个目的:
Q.allSettled([promise1, promise2]).then(function (results) { // results is an array of objects of the form: // { state: "fulfilled", value: ... } // or // { state: "rejected", reason: ... } });
如果您正在讨论AngularJS中包含的$q
,它没有这个方法,但是您可以创build自己的ad-hoc版本:
myApp.service('allSettled', ['$q', function ($q) { return function (values) { return $q.all(values.map(function (value) { return $q.resolve(value) .then(function (result) { return { state: "fulfilled", value: result }; }) .catch(function (error) { return { state: "rejected", reason: error }; }); })); } }]);
你可以在每个请求返回之后处理catch错误,否则返回null。
或者你可以使用蓝鸟Promise.some()
并定义你的n
请求的阈值。
Promise.some([ ping("ns1.example.com"), ping("ns2.example.com"), ping("ns3.example.com"), ping("ns4.example.com") ], 2).spread(function(first, second) { console.log(first, second); });
您可以使用Q.allSettled()
或Q.any()
。 看文档:
蓝鸟更多的select。 看到:
- http://bluebirdjs.com/docs/api/promise.some.html
- http://bluebirdjs.com/docs/api/promise.any.html
- http://bluebirdjs.com/docs/api/promise.race.html
请注意,在本地promise(还没有)中没有Promise.any
和Promise.some
,没有Q.some
。