Javascript 只有在第一个承诺没有返回良好结果时,才执行其他承诺

Javascript 只有在第一个承诺没有返回良好结果时,才执行其他承诺,javascript,node.js,promise,bluebird,Javascript,Node.js,Promise,Bluebird,所以我在这几天里一直在努力,我已经找到了解决办法,但我觉得这不是一个好办法。 我目前有以下几点。我不喜欢它,因为我把承诺放在承诺中。我不知道这是否合适,但看起来不像 我试图用这段代码完成的是首先检查缓存数据库中的值,如果它不在那里,那么我将检查真实的数据库 关于如何更优雅地做到这一点,有什么提示/窍门/指点/意见吗 var getData = function() { var cancel = false var cache = db.getFromCache(query)

所以我在这几天里一直在努力,我已经找到了解决办法,但我觉得这不是一个好办法。 我目前有以下几点。我不喜欢它,因为我把承诺放在承诺中。我不知道这是否合适,但看起来不像

我试图用这段代码完成的是首先检查缓存数据库中的值,如果它不在那里,那么我将检查真实的数据库

关于如何更优雅地做到这一点,有什么提示/窍门/指点/意见吗

var getData = function() {
    var cancel = false
    var cache = db.getFromCache(query)
      .then((data) => {
      // Check if data is up to date
         if (uptodate) { 
            return Promise.resolve(data) 
         }
         cancel = true      
       })

   return cache
        .then(() => {
          if (cancel)
             return db.getFromDatabase().then( //code)
    }
}

附:这段代码可能会运行,也可能不会运行。我只是为了这个问题快速编写了它。我无法通过此处的实际代码

承诺支持链接,这意味着一个承诺可以返回另一个承诺,而这个承诺可以返回另一个承诺,依此类推

根据:

您可以将lambda匿名函数传递给then,如果它返回 一个承诺,一个等价的承诺将暴露于随后的 然后在方法链中。 当一个值只是从一个lambda中返回时,它将 有效地回报承诺。决心。 这意味着在then块中,可以检查缓存中的数据是否是最新的。如果数据是新的,则返回它,并且该值将被包装在新的承诺中。如果数据过时,可以返回调用getFromDatabase,该调用将返回承诺:

const getData = (query) => db.getFromCache(query)
    .then((data) => isUpToDate(data) ? data : db.getFromDatabase(query));

getData().then(/** code **/);
从承诺返回使用新承诺包装返回的数据,因此您可以操作数据并返回它,并且它将自动由承诺包装:

db.getFromDatabase().then((data) => data.map(/** some code **/)); // result will be wrapped in a promise.
当您处于.then处理程序中时,可以执行以下任一操作:

返回一个值-该值成为父承诺的解析值。因此,不需要返回Promise.resolve值。您可以只返回值

返回承诺-当您返回承诺时,它将链接到父承诺,并且父承诺将不会解决,直到此新承诺解决,并且此返回承诺的解决值将成为父承诺的解决值

抛出异常-如果.then处理程序抛出异常,则promise基础结构会自动捕获该异常,并将其转换为拒绝,因此Throw err的工作方式与返回promise.rejecterr类似

因此,当您在.then处理程序中时,您可以检查缓存数据是否有效,如果有效,只需返回它即可。否则,返回获取数据的新承诺

var getData = function() {
    return db.getFromCache(query).then((data) => {
         // Check if data is up to date
         if (uptodate) { 
            // return cached data, will be resolved value of promise
            return data; 
         } else {
            // get data from db, return promise that will be chained
            return db.getFromDatabase();
         }
   })
}

getData().then(...)
您的代码比需要的复杂得多:

你不需要承诺,你需要决心。您只需返回值即可。 您根本不需要cancel变量。您可以在第一个处理程序中完成所有工作,然后是处理程序。 你不需要第二个,然后是handler。
它是有效的:但是,它很麻烦,而且没有使用promise功能。是的,这就是我一直在寻找的词。这很麻烦。这就是为什么我希望它与众不同。不那么麻烦:你为什么要调用缓存?缓存真的是一个返回承诺的函数吗?这看起来没有任何意义。db.getFromCache返回promiseThen缓存。then是错误的,无法工作。也许你指的是缓存。那么。啊,是的,我明白了。你看到代码下面的ps了吗:P。它不是实际的代码,但是思想是sameDrop,cancel变量,你的代码应该变得简单得多。你是对的,我的代码比它需要的复杂得多。这使情况更加清楚。Thnx