【问题标题】:Native Promise in Chrome doesn't resolveChrome 中的原生 Promise 无法解决
【发布时间】: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


【解决方案1】:

调试器不会进入解析,因为它是本机代码。

我怀疑您的代码中的错误阻止了 resolve 实际被调用(可能回复事件没有到来,或者 id 不匹配)。

【讨论】:

  • 正如我在对该问题的评论中提到的,这是我的驾驶舱错误。 Promise 正在像 Chrome 中宣传的那样工作。感谢大家对所有有用的 cmets。
  • Resolve 被调用。 Promise.then 的调用方式存在问题,当我专注于调试器的红鲱鱼没有进入 Promise 内的解析处理程序时,我错过了这个问题。
猜你喜欢
  • 2020-09-17
  • 2020-07-05
  • 2017-10-28
  • 1970-01-01
  • 1970-01-01
  • 2017-06-21
  • 2018-02-06
  • 2020-02-07
相关资源
最近更新 更多