2016-07-29 71 views
1

我有一个ES6可执行/承诺链的情况。链中的第一个承诺实际上是一种异步方法,它确定缓存是否可能首先被刷新,并且链中的后续方法进行实际刷新。有没有更优雅和直观的方法来打破ES6 Promise链?

问题是,如果第一种方法确定我不应该实际刷新缓存,我想要从链中弹出......我不需要做其余的事情。

我能够得到这个工作的唯一方法是将测试方法的结果和每个后续的.then()链中的结果存储起来,以测试是否实际执行某些操作或返回简单的Promise.resolve(null)。

这看起来像一堆额外的愚蠢的代码,不应该真的需要在那里。

我的代码如下工作....错误处理是正确的....但有没有更好的方式来编码这种模式,你只想有条件地继续链?一种不涉及存储答案然后在每个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 Promise并非真正的承诺。所以我最初的希望是ES6 Promise的规范和实现将适应这个看似重要的需求和用例。看起来可能并非如此。所以对这些问题的答案可能是这个问题的“正确”答案,但它们不是关于ES6承诺的。这对我来说似乎不同。

+0

处理错误和处理错误消息或拒绝承诺的原因,我不认为这件事确实是重复的是不是ES6承诺,请模式完全一样。 – Bergi

回答

3

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

你可以throwError或使用Promise.reject().then(),在.catch()

+0

我很欣赏这个答案,并且我看到它是如何工作的,但是使用异常(或拒绝)来控制预期的程序流程似乎有问题。也不是特别可读。感觉和我的解决方案一样有问题。我想知道最好的解决方案是不是将这个承诺嵌套在一起。 –

+0

答案只演示了一种可能的方法。你也可以在'.then()'处检查'null'的值,并在Question处使用现有的模式。您不需要使用'Promise.resolve(null)'作为'.then()'返回一个新的'Promise';你可以单独使用带'null'的三元作为返回链接'.then()'的值。投掷错误绕过'.then(onFulfilled)' – guest271314

相关问题