[英]Resolve promise on external event
當事件發生在不同的 function 中時,我想解決 promise
const trigger = function() {}
const eventHandler = async function() {
while(true) {
await new Promise (resolve => {
}
// Code when the promise fulfills.
}
}
const cleaner = function() {
trigger()
}
cleaner()
您可以通過重新分配trigger
非常輕松地做到這一點:
let trigger = () => {}
const eventHandler = async function() {
while(true) {
await new Promise (resolve => {
trigger = resolve
// ^^^^^^^^^^^^^^^^^
}
// Code when the promise fulfills.
}
}
const cleaner = function() {
trigger() // calls resolve to fulfill the currently waited-for promise
}
eventHandler() // start waiting
cleaner()
但是,請注意這通常被認為是一種不好的做法,您應該啟動導致外部事件的任何內容,尤其是安裝事件偵聽器,在new Promise
執行器回調中,您可以輕松訪問resolve
function。
下面是一個示例,說明如何使 promise 可取消。 我們使用了一個幫助器 function makeCancelable(),它接受一個 promise,並返回一個不同的 promise 和一個取消 ZC91C4125274C178 沒有辦法只是“取消”現有的 promise,尤其是當您無法控制 promise 的制作方式時,但您可以做的是將現有的 promise 包裝起來,但新的行為與原始 ZB321DE3BDC295D7D9DEEBZ 一樣也准備在命令下解決。
// Helper function that just waits for a timeout const wait = ms => new Promise(resolve => setTimeout(resolve, ms)) function makeCancelable(promise) { let resolveWrappedPromise return { promise: new Promise((resolve, reject) => { resolveWrappedPromise = resolve promise.then(resolve, reject) }), cancel: value => resolveWrappedPromise(value), } } cancelPromise = () => {} // function used by onClick event async function eventHandler() { while (true) { const { promise, cancel } = makeCancelable(wait(1000).then(() => 'Success.')) cancelPromise = cancel console.log(await promise) } } eventHandler()
<button onclick="cancelPromise('Canceled!')">Cancel!</button>
在此代碼示例中,“成功”。 將每秒打印一次 - 除非您按下按鈕取消當前的 promise,否則重復按下按鈕將延遲“成功”。 由於 promise 被取消並提供了“取消!”值,因此無法確定地打印。 當取消發生時。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.