首页  >  文章  >  web前端  >  我们可以强制取消 JavaScript 中的 Promise 吗?

我们可以强制取消 JavaScript 中的 Promise 吗?

Barbara Streisand
Barbara Streisand原创
2024-10-30 15:09:03351浏览

 Can We Forcefully Cancel Promises in JavaScript?

Promise:我们真的可以强制取消吗?

ES6 中引入的 Promise 改变了我们的异步编程方法。然而,在某些情况下,我们可能需要干预并强行取消 Promise,例如在预先输入搜索场景的情况下。

那么,我们可以取消 Promise 吗?

在现代 JavaScript,残酷的现实是:。 Promise 目前不支持取消。

我们可以做什么?

由于无法直接取消 Promise,因此出现了替代方法。

使用取消令牌

取消标记是一种允许您将可取消变量传递到函数中的机制。当调用令牌时,它会中止操作并拒绝关联的 Promise。这是一个示例:

function getWithCancel(url) { // token for cancellation
  var xhr = new XMLHttpRequest();
  xhr.open("GET", url);
  return new Promise(function(resolve, reject) {
    xhr.onload = function() { resolve(xhr.responseText); };
    token.cancel = function() {
      xhr.abort();
      reject(new Error("Cancelled"));
    };
    xhr.onerror = reject;
  });
}

通过这种方法,您可以:

var token = {};
var promise = getWithCancel("/someUrl", token);

// later on:
token.cancel();

使用第三方库

有希望的,“请原谅双关语,”库像 Bluebird 一样,提供对 Promise 取消的支持以及其他高级功能。

采用最后调用模式

此模式确保仅执行函数的最后一次调用。它采用令牌方法来取消先前的调用:

function last(fn) {
  var lastToken = { cancel: function(){} };
  return function() {
    lastToken.cancel();
    var args = Array.prototype.slice.call(arguments);
    args.push(lastToken);
    return fn.apply(this, args);
  };
}

用法:

var synced = last(getWithCancel);
synced("/url1?q=a"); // canceled
synced("/url1?q=ab"); // canceled
synced("/url1?q=abc"); // canceled
synced("/url1?q=abcd").then(function() {
  // only this will run
});

结论

虽然令人失望的是 Promise 本身并不支持取消,但前面提到的技术提供了可行的解决方法。随着语言的发展,真正的承诺取消可能在未来成为现实。

以上是我们可以强制取消 JavaScript 中的 Promise 吗?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn