假定我有一个返回项目列表的服务,并用查询词调用它,然后返回带有结果的Promise。当它两次调用时(每次都使用不同的查询词),有时最终会返回旧结果而不是新结果。解决问题的最佳方法是什么? 有什么办法可以取消承诺? 使用纯js(且不可观察)
答案 0 :(得分:0)
我一直听说您无法取消Promises。那实际上是与可观察物的主要区别之一-您可以取消可观察物。是的,您可以创建一个可观察对象,然后将其转换为Promise。但是,重新看一下Bluebird API(Bluebird是一个用于处理Promises的知名库-随着ES2015的采用和最新JS开发的开始废弃,)我看到它们有一个cancel方法:
http://bluebirdjs.com/docs/features.html#cancellation-and-timeouts
根据Bluebird文档中的示例:
// Enable cancellation
Promise.config({cancellation: true});
var fs = Promise.promisifyAll(require("fs"));
// In 2000ms or less, load & parse a file 'config.json'
var p = Promise.resolve('./config.json')
.timeout(2000)
.catch(console.error.bind(console, 'Failed to load config!'))
.then(fs.readFileAsync)
.then(JSON.parse);
// Listen for exception event to trigger promise cancellation
process.on('unhandledException', function(event) {
// cancel config loading
p.cancel();
});
您仍然必须添加一个库。如果您在编写承诺时要牢记取消,就可以使用Plain JS,但是您始终要遵守其他API。例如,您可以中止XHR请求,但您不能取消许多其他承诺。仍然来自Bluebird的文档,我在这里发布了这个示例:
function makeCancellableRequest(url) {
return new Promise(function(resolve, reject, onCancel) {
var xhr = new XMLHttpRequest();
xhr.on("load", resolve);
xhr.on("error", reject);
xhr.open("GET", url, true);
xhr.send(null);
// Note the onCancel argument only exists if cancellation has been enabled!
onCancel(function() {
xhr.abort();
});
});
}
您可以根据您的用例以这种方式设计承诺。