首页 > 解决方案 > Promise 构造函数和“属性 'handleEvent' 不可调用”错误

问题描述

此代码返回上述错误 - 为什么?

function rej(params) {
}
function res(params) {
}

let func = new Promise(function (res, rej) {
});

我究竟做错了什么?

编辑

一些额外的信息(如评论中所建议的)

我正在尝试了解 Promise 构造函数以及如何使用它。我不是在寻求解决问题的技术,我只是试图理解它。
通过将 ' 链接到它来使用 Promise 很简单then。我问的是关于构造函数的。
谢谢

标签: javascriptpromise

解决方案


我究竟做错了什么?

首先,这段代码:

let func = new Promise(function (res, rej) {
});

创建一个永远不会被解决或拒绝的承诺。应该在该回调函数中包含执行异步操作的代码,然后当该异步操作完成时,它会调用传递给该回调的两个函数中的一个res(value)rej(reason). 这里回调函数的两个参数: function (res, rej) {是 promise 创建并传递给回调的函数。作为承诺的创造者,你的工作是在未来的某个时间调用其中之一。没有任何代码调用其中之一的承诺是没有用的。它只是一个从不做任何事情的对象。

其次,此代码还将新创建的承诺分配给名为 的变量func。这意味着你认为它是一个函数。它不是。它是一个对象,更具体地说是一个 Promise 对象。您不能像调用函数那样调用该对象。

第三,然后您接受该承诺并将其作为回调函数传递:

btn.addEventListener("click", func);

addEventListener()需要第二个参数是一个函数。你传递了一个不是函数的承诺。这是一个调用错误。


如果没有进一步描述(用文字)您要完成的工作,我们无法提出更具体的编码建议,只能回答您的直接问题并解释您在显示的代码中做错了什么。


另外,请记住,promise 是一次性设备。它们永远不会被解决或拒绝超过一次。因此,当事件可能发生多次(如按钮单击)时,它们通常与事件侦听器不能很好地匹配,除非您只想知道第一次单击而没有后续单击。它们确实与仅发生一次的事件(例如finishedclose或类似的事件)很好地匹配。


推荐阅读