【问题标题】:Resolve promise in callback在回调中解决承诺
【发布时间】:2020-12-29 22:12:49
【问题描述】:

我的 client-websocket 提供了为某些事件注册回调的方法,例如当连接打开或关闭时。在这些回调中,我想解决一个承诺,以便我可以await 外部事件的发生。我在单元测试中使用它。我想要这样的东西:

let wsOnOpenPromise = new Promise<void>(resolve => { /* ??? */ });
let wsOnClosePromise = new Promise<void>(resolve => { /* ??? */ });
const ws = new WebsocketBuilder(url)
    .onOpen((i, e) => { /* resolve wsOnOpenPromise here */ })
    .onClose((i, e) => { /* resolve wsOnClosePromise here */ })
    .build();
await wsOnOpenPromise;
shutdownServer(); /* Shutdown the server here, the on-close event should fire */
await wsOnClosePromise;

我该怎么做?看来我需要先定义承诺,然后在回调中定义 resolve 它们,以便以后可以像代码中所示那样 await 它们。

【问题讨论】:

  • resolve =&gt; { resolve() })

标签: typescript promise async-await


【解决方案1】:

应该这样做:

const ws = new WebsocketBuilder(url);
const onOpen = new Promise(ws.onOpen.bind(ws));
const onClose = new Promise(ws.onClose.bind(ws));
ws.build();
await onOpen;
shutdownServer(); /* Shutdown the server here, the on-close event should fire */
await onClose;

说明:

下面的表达式:

new Promise(ws.onOpen.bind(ws))

...确实类似于:

new Promise((resolve, reject) => ws.onOpen(resolve, reject))

由于onOpen 只接受一个参数,reject 并没有真正发挥作用。这可以进一步扩展为等价物:

new Promise((resolve, reject) => ws.onOpen((i, e) => resolve(i, e), reject))

同样在这里,resolve 只接受一个参数,所以i 将是 promise 解析的值——即使你对它并不真正感兴趣。这就是为什么我们可以将所有内容缩短为:

new Promise(ws.onOpen.bind(ws))

onClose 的原理相同。

【讨论】:

  • 感谢您的帮助和良好的解释!我很感激!
【解决方案2】:

我是这样工作的:

let onOpen = () => {};
let onClose = () => {};
const wsOnOpenPromise = new Promise<void>(resolve => onOpen = resolve);
const wsOnClosePromise = new Promise<void>(resolve => onClose = resolve);
const ws = new WebsocketBuilder(url)
    .onOpen((i, e) => { onOpen() })
    .onClose((i, e) => { onClose() })
    .build();
await wsOnOpenPromise;
/* Shutdown the server here, the on-close event should fire */
await wsOnClosePromise;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-23
    • 1970-01-01
    • 2016-08-19
    • 2015-06-24
    • 2022-01-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多