ES6 中引入的 Promises 改变了我们的异步编程方法。然而,在某些情况下,我们可能需要干预并强制取消 Promise,例如在预先输入搜索场景的情况下。
In现代 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();
Promising,“请原谅双关语”,像 Bluebird 这样的库提供对承诺取消的支持,以及其他高级功能。
此模式确保仅执行函数的最后一次调用。它采用令牌方法来取消先前的调用:
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 本身并不支持取消,但上述技术提供了可行的解决方法。随着语言的发展,真正的承诺取消可能在未来成为现实。
免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。
Copyright© 2022 湘ICP备2022001581号-3