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