取消js承诺的最佳方法是什么?

时间:2019-05-21 07:24:55

标签: javascript promise cancellation

假定我有一个返回项目列表的服务,并用查询词调用它,然后返回带有结果的Promise。当它两次调用时(每次都使用不同的查询词),有时最终会返回旧结果而不是新结果。解决问题的最佳方法是什么? 有什么办法可以取消承诺? 使用纯js(且不可观察)

1 个答案:

答案 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();
        });
    });
}

您可以根据您的用例以这种方式设计承诺。