Q 库 (javascript) - 在 Q.all() 的承诺中处理 q.reject()

Q library (javascript) - handling q.reject() in a promise with Q.all()

我正在建立一个博客站点 w/Express,并且是第一次使用 Q,我希望能够利用资深 Q 用户的知识。

我正在向我的数据库发出一个请求以加载 post 数据,另一个请求到达 Instagram API(除非它已经缓存)和 returns 一些 json。所以我有类似的东西:

Q.all([blogPromise, instagramPromise]).then(good, bad);

我 运行 的 issue/question 是说我的请求在我的 instagramPromise 中失败,我调用 deferred.reject(),我的 bad 函数是叫。但是,如果我的 blogPromise 解析了,我仍然想用博客 post 数据加载页面,但是当我的 bad 函数被调用时,我似乎没有得到任何参数(例如我不要获取成功获取的 blogPromise 数据)。

鉴于此,我唯一的选择似乎是在出现错误时不调用 deferred.reject(),而是使用 deferred.resolve({error: true}) 之类的东西调用 deferred.resolve(),然后我可以在我的 good 函数处理传递到我的视图的内容。

所以我的问题是,这听起来对吗?这不是滥用 Q 使用 resolve 而实际上我 运行 出错并且应该使用 reject 吗?还是我遗漏了 Q 的某些内容,可以采用更好的方法?

如果您希望在 blogPromiseinstagramPromise 都解决或拒绝时解决您的承诺,则需要使用 allSettled method。这是文档中的示例:

Q.allSettled([blogPromise, instagramPromise])
.then(function (results) {
    var loaded = results.filter(function (result) {
        return result.state === "fulfilled";
    });
    good(loaded);
});

allSettled 的 then 回调中,您可以过滤成功加载的结果并将它们传递给 good 函数。或者用 bad one.

以某种方式处理失败的结果

也许是这样的?

Q.all([
    blogPromise,
    instagramPromise.catch(function() { return {error: true}; })
]).then(good, bad);

和你说的类似,区别是在使用的地方抑制错误,而不是在错误产生的地方抑制错误。