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