首页 > 解决方案 > 如何返回从回调中解决的承诺

问题描述

我的承诺逻辑有问题(对 JS 来说还是很新),我找不到问题所在。看看我做我想做的事有多难,我只能猜测那不是正确的方法。我确实找到了另一种修复它的方法,但我仍然对是否有办法做我想做的事感兴趣。

以下是一些细节:

我有一个MessageQueue.sendMessage()将我给的消息添加到PendingMessageCache. 如果可以,则MessageQueue获取缓存并将其发送Message到服务器。

有时我需要在消息发送后做一些事情。所以我在发送消息时添加了一个callback,保存和调用。MessageQueue它工作得很好。调用看起来基本上是这样的:

await MessageQueue.sendMessage(myMsg, () => {markMessageAsSent()});

对于一种新类型的消息,我需要等待消息被有效发送,因为应用程序在它之后被完全清理。

由于 sendMessage只是将消息添加到cache并返回,因此callback稍后会调用,但在这种情况下为时已晚,应用程序已重新启动。

该消息基本上是一个lastMessage发送到服务器的消息,表示该用户删除了特定的应用程序实例。

所以我认为我想要的是这样的:

deleteAccount = async () => {
    const aMagicalCallback;

    // this call adds the message to the cache, 
    // and ask the MessageQueue to call aMagicalCallback when that lastMsg is sent
    await MessageQueue.sendLastMessage(lastMsg, <aMagicalCallback>);
    // return the callback which would be a promise.
    // this promise is resolved when it is resolved 
    // when the MessageQueue invokes the callback <aMagicalCallback>
    return <aMagicalCallback>;
}

我想做的基本上是

    // wait for the lastMessageBeingEffectively sent
    await deleteAccount();
    app.eraseEverything();
    app.restart();

让我知道这是否还不清楚。谢谢

标签: javascripttypescriptes6-promise

解决方案


您应该返回 aPromise而不是 using async。因此,即使在嵌套回调函数中,您也可以选择何时解决承诺:

deleteAccount = () => new Promise(resolve => {
    MessageQueue.sendLastMessage(lastMsg, () => {
        // do your thing
        resolve();
    });
});

然后你可以像普通async函数一样等待它

// this awaits until the resolve() above has been called
await deleteAccount();

app.eraseEverything();
app.restart();

推荐阅读