【发布时间】:2019-10-19 21:51:32
【问题描述】:
此代码工作正常:
let promise;
try {
promise = parent();
//but I want: await parent();
await continueStack();
} catch (e) {
console.log('Caught error in endpoint');
}
eventBus.on('stop::all', () => {
console.warn('Caught stop::all event');
promise.cancel();
});
它正在取消对程序其他部分发出的事件的承诺。我的问题是我不能拥有await parent(),因为那时还没有执行监听事件。如果我改成这样:
let promise;
eventBus.on('stop::all', () => {
console.warn('Caught stop::all event');
promise.cancel();
});
try {
promise = await parent();
await continueStack();
} catch (e) {
console.log('Caught error in endpoint');
}
那我有错误
TypeError: 无法读取未定义的属性“取消”
它崩溃了,continueStack() 永远不会被执行。我想如何调和这些?
我已经用上面的场景创建了整个示例:
https://gist.github.com/BorysTyminski/147dc2e0c44c8d64386253d563ff6db4
为了运行它,你需要获取这两个文件,安装 package.json 依赖并运行 cURL / Postman request GET to localhost:5000/test
【问题讨论】:
-
有什么意义?为什么要在那里使用
await?另外,promise = await parent();将 promise 的解析值存储在let promise中,而不是 promise 本身。因此promise.cancel不存在,因为您没有承诺,只有已解决的值。 -
因为我想在父函数之后执行 continueStack 并且我正在从父函数返回新的 Promise。
-
谁/什么调度了
stop::all事件?parent()是否有机会发送该事件?基本上打算取消它要返回的Promise?或者这是不可能发生的情况? -
事件是从其他线程上运行的后台进程发出的。基本上,我正在为带有硒的电子应用程序创建用于动态网络应用程序游戏的机器人。可以说
parent是在板上循环的函数。当后台进程检测到该怪物出现在板上时,我想取消parent。我将在稍后创建示例并编辑帖子。
标签: javascript promise bluebird cancellation