javascript - 如何返回从回调中解决的承诺
问题描述
我的承诺逻辑有问题(对 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();
让我知道这是否还不清楚。谢谢
解决方案
您应该返回 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();
推荐阅读
- swift - hyperoslo/ImagePicker的预选图片
- c# - WCF C# webservice 接受 XML 属性中的文件
- python - KNN- NBA 球员
- xamarin - 如何将列表视图点击事件中的数据传递到另一个页面中的 Telerik 数据表单
- python - Python 创建一个类的多个实例
- function - Azure Function 2.0 一直卡住,直到我在门户中打开它?
- amazon-neptune - 如何使用java以编程方式在aws neptune中创建顶点
- html - Bootstrap Accordion 中的 Twitter 分享按钮不显示
- node-red - Watson Assistant NodeRed 节点不接受新的 IAM 安全凭证
- angular - 角度材料选项卡高度