簡體   English   中英

解決外部事件上的 promise

[英]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 被取消並提供了“取消!”值,因此無法確定地打印。 當取消發生時。

使用 EventEmitter2 package 的waitFor方法( 現場演示)。

import EventEmitter2 from "eventemitter2";

const emitter = new EventEmitter2();

(async () => {
  const data = await emitter.waitFor("test");
  console.log("emitted", data);
})();

setTimeout(() => emitter.emit("test", 1, 2, 3), 1000); 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM