【发布时间】:2023-03-03 04:45:01
【问题描述】:
我正在尝试通过添加事件侦听器并基于以字符串形式出现的事件数据中的eventName 属性来收听“消息”,我需要做出承诺并从 API 获取一些数据.
但是这个承诺电话没有发生。
样本数据:
event.data = `{"eventName":"modal:open","eventData":{"state":"redeem","stateParams":{"rewardTitle":"Lab Coat Live - 35% Discount","rewardId":550288},"width":700,"src":"https://qa-crowdtwist.thermofisher.com/widgets/t/redeem/550288/#2"},"direction":"up","widgetId":13324,"version":2}`
如果是"eventName": "reward:redeemed",那么我需要进行 API 调用。但是承诺没有执行,也没有抛出任何错误。我做错了什么还是有任何其他程序可以使这个承诺生效?
const event = new Event("message");
$window.addEventListener(event.type, function (event) {
if(typeof event.data === "string"){
var data = event.data;
var redeemed = false;
if(data.indexOf("reward:redeemed")){
redeemed = true;
}
}
if(redeemed){
dataService.getUserPoints();
}
}, false);
$window.dispatchEvent(event);
【问题讨论】:
-
弄清楚发生了什么的最简单方法是添加
console.log()并检查数据。在 Chrome devtools 中,您还可以设置断点并检查调用堆栈和局部变量。例如,在您的第一个 if 语句上方添加一个 console.log(event)。检查输出。event.data实际上是一个字符串吗?重复直到找到问题。在转向 stackoverflow 之前,您应该先尝试调试。 -
在您显示的代码中,
event是一个空的Event对象,只有它的type设置为"message"。它不是MessageEvent,也没有data属性。此外,即使它与您当前的问题无关,if( string.indexOf(sub_string) )也不是您应该如何检查字符串是否包含子字符串,这只会告诉您是否在字符串的开头找到了子字符串(索引=0) 在这种情况下不会进入 if 块。如果子字符串不是字符串的一部分 indexOf 将返回-1这是真实的。你想要的是if( string.includes( sub_string ) )。
标签: javascript angularjs promise message addeventlistener