我想知道是否有任何取消/停止包含多個等待函式的 javascript 函式的執行。由于承諾的性質以及它們缺乏適當的取消,是否有任何其他實作或庫可以幫助我實作這樣的目標?
async function run(x,y,z) {
return new Promise(async(resolve,reject) => {
await doSomething(x)
await doSomething(y)
//cancel could be happen around here and stop the last "doSomething"
await doSomething(z)
})
}
setTimeout(() => {
run.cancel()
},500) //cancel function after 500ms
uj5u.com熱心網友回復:
要停止從一個函式呼叫到下一個函式呼叫的進展,您可以執行以下操作:
function run(x, y, z) {
let stop = false;
async function run_internal() {
await doSomething(x)
if (stop) throw new Error("cancelled");
await doSomething(y)
if (stop) throw new Error("cancelled");
await doSomething(z)
}
return {
cancel: () => {
stop = true;
},
promise: run_internal();
};
}
const retVal = run(a, b, c);
retVal.promise.then(result => {
console.log(result);
}).catch(err => {
console.log(err);
})
setTimeout(() => {
retVal.cancel()
}, 500); //cancel function after 500ms
Javascript 沒有通用的方法來“中止”函式的任何進一步執行。您可以通過外部函式設定標志,然后在函式的各個點檢查該標志,并根據該標志調整您執行的內容。
請記住(使用 workerThreads 或 webWorkers 時除外),Javascript 在單個執行緒中運行您的代碼,因此當它運行時,它正在運行,而您的其他代碼都沒有運行。只有當它將控制權回傳給事件回圈(通過回傳或通過點擊await)時,您的任何其他代碼才有機會運行并執行任何操作。因此,“當它實際運行時”,您的其他代碼將不會運行。當它位于 時await,您的其他代碼可以運行并可以設定一個以后可以檢查的標志(如我上面的示例所示)。
fetch()在瀏覽器中對 AbortController 介面有一些實驗性的支持。但是,請理解,請求一經發送,即已發送,服務器將收到。您可能不會中止服務器正在執行的任何操作。如果回應仍未回傳或正在回傳程序中,您的中止可能會中斷該回應。由于您無法真正知道什么被中止,我認為最好只檢查您自己的代碼,這樣您就不會處理回應或根據您設定的標志進行進一步處理。
如果需要,您可以將此標志檢查包裝到 AbortController 介面中,但它不會以任何方式改變根本問題 - 它只會影響您為呼叫中止而公開的 API。
uj5u.com熱心網友回復:
實際使用取消的方法是通過瀏覽器和 Node 15 上可用的 AbortController
節點參考:https ://nodejs.org/api/globals.html#class-abortcontroller
MDN 參考:https ://developer.mozilla.org/en-US/docs/Web/API/AbortController
一些 API 目前正在使用開箱即用的中止信號,例如瀏覽器中的 fetch 或 Node 中的 setTimeout timers API ( https://nodejs.org/api/timers.html#timerspromisessettimeoutdelay-value-options )。
對于自定義函式/API,您需要自己實作它,但強烈建議您遵循 Abort 信號方法,以便您可以鏈接自定義函式和 oob 函式,并使用不需要轉換的單個信號
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/424021.html
標籤:javascript 节点.js 承诺 es6-承诺 消除
