【发布时间】:2014-06-07 22:09:34
【问题描述】:
我正在使用 Chrome v. 35,据报道它提供对 Promise 的本机支持。浏览器确实可以识别 Promise 构造函数,但是以网络上无数示例和文档链接中显示的方式使用它是行不通的。
这是我创建 Promise 的方式:
var promise = new Promise(function(resolve,reject) {
self.events.on("reply",function(event) {
if (event.msgId === id) {
resolve(event.packet);//we get here, but fail to step into method resolve
}
});
self.events.on("cancelReply",function(event) {
if (event.msgId === id) {
reject(Error(event.msgId));
}
});
});
调用回调“resolve”无效。在调试器中,该函数存在,但单步执行它只会将控制权传递给下一行。并且永远不会调用 promise 上的“then”方法:
promise.then(function(result) {
//we never get here
});
谁能告诉我我错过了什么?
【问题讨论】:
-
调试器不会进入
resolve,因为它是本机代码。您确定resolve实际上被调用(回复事件即将到来,并且 id [在哪里定义?] 匹配)?还要记住promise.then在下一个运行循环期间承诺有机会解决之前不会触发。 -
这里不需要承诺。
-
因为它不是事件管理的正确工具。例如,您的承诺只会起作用一次:直到您解决或拒绝它。
-
相反,promise 可以很好地处理(某些类型的)事件。当然,您需要为每个预期事件设置一个承诺,正如您所说,它最多会被履行/拒绝一次,但我们没有迹象表明 OP 没有意识到或没有这样做。
-
@dfsq 很多时候有事件发射器接口你并不关心。例如,XHR 是事件发射器接口,您可以将成功事件映射到解决、中止、超时和错误事件以拒绝,并且根本不关心进度事件(或单独对其进行回调)。
标签: javascript google-chrome asynchronous promise