是否有一种更优雅,更直观的方式来打破ES6 Promise链?

时间:2016-07-29 04:14:12

标签: javascript promise ecmascript-6 chaining es6-promise

我有一系列ES6可用/承诺的情况。链中的第一个承诺实际上是一个异步方法,它确定是否可以首先刷新缓存,并且链中的后续方法进行实际刷新。

问题是,如果第一种方法确定我不应该真正刷新缓存,我想炸掉链条......我不需要做其余的事情。

我能够让它工作的唯一方法是将测试方法的结果和链中的每个后续.then()存储起来,以测试是否实际做某事或返回一个简单的Promise.resolve(空)。

这似乎是一堆额外的愚蠢代码,不应该真的需要在那里。

我的代码可以工作....错误处理是正确的....但有没有更好的方法来编码这种模式,你只想有条件地继续链?一种不涉及存储答案然后在每个then()上强制使用Promise.resolve()的方法吗?

function asyncRefreshCache(wDb, forceRefresh) {
    var cachedDataVersions;
    var allowRefresh;
    return wDb.asyncCacheRefreshAllowed(forceRefresh) // Here I test whether I am allowed to really refresh the cache.
        .then(function (ar) {
            allowRefresh = ar;
            return allowRefresh 
                ? wDb.asyncGetCacheDataVersionsForRefresh() // Only do this if allowed above.
                : Promise.resolve(null); //Yuck.  Would love to just break out.  But how?
        })
        .then(function (dataVersions) {
            cachedDataVersions = dataVersions;
            return allowRefresh
                ? asyncServerFlexSearch({ dataVersions: dataVersions, includeInactiveFlag: true, onLoadFlag: true }) // Only do this if allowed above.
                : Promise.resolve(null); //Yuck.  Would love to just break out.  But how?
        })
        .then(function (serverResponse) {
            return allowRefresh
                ? wDb.asyncMergeCleanDataFromServerToCache(cachedDataVersions, serverResponse) // Only do this if allowed above.
                : Promise.resolve(null); //Yuck.  Would love to just break out.  But how?
        });
}
编辑:由于有关Q Promises和JQuery Promises的类似问题,此问题被标记为重复。 JQuery承诺并没有真正的承诺。所以我最初的希望是ES6 Promises的规范和实现将适应这个看似重要的需求和用例。似乎情况可能并非如此。所以其他问题的答案可能是"正确的"回答这个问题,但他们不是关于ES6承诺。所以这对我来说似乎有所不同。

1 个答案:

答案 0 :(得分:3)

  

但有没有更好的方法来编码这种模式,只有你自己   想有条件地继续连锁?

您可以throw ErrorPromise.reject()使用.then(),处理错误并处理错误消息或拒绝承诺原因.catch()