【问题标题】:Promise constructor and "Property 'handleEvent' is not callable" errorPromise 构造函数和“属性 'handleEvent' 不可调用”错误
【发布时间】:2020-04-21 03:05:58
【问题描述】:

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

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

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

我做错了什么?

编辑

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

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

【问题讨论】:

  • let func = new Promise 不,func 是一个 Promise,而不是一个函数 - new Promise 返回一个 Promise 实例
  • @CertainPerformance 我了解。那么,在这种情况下,我对构造函数有什么用处?
  • 为了帮助您修复这个结构错误的代码,我们需要了解您要解决的问题。你想让 btn 点击监听器做什么?对于我们来说,帮助您解决实际问题可能更有用,而不是试图解释为什么当您将函数以外的东西传递给侦听器时,您会收到此特定错误。此外,您对resrej 的定义看起来也错误,因为这些函数是由promise 本身创建并传递给promise executor 回调函数的。然后你打电话,你不创建它们。你想做什么?
  • @yossi - 我不知道那条评论是什么意思。我在您显示的代码中没有看到任何链接。我重复。如果您需要帮助,请告诉我们您要完成的工作。此代码远非正确,我们无法判断您要执行的操作。
  • 它们不使用您在此处使用的相同语法。您创建一个承诺,在 executor 函数中不放任何东西,这样承诺永远不会被拒绝或解决,然后您将一个承诺传递给一个完全没有意义的事件侦听器。 MDN 不做任何这些事情。加上你命名的变量意味着你认为func 是一个函数。不是,是承诺。除了var btn = document.getElementById("_btn");,您显示的代码实际上没有任何正确之处。因此,在您用文字解释您要完成的工作之前,我们无法为您提供帮助。

标签: javascript promise


【解决方案1】:

我做错了什么?

首先,这段代码:

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

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

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

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

btn.addEventListener("click", func);

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


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


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

【讨论】:

    【解决方案2】:

    任何时候你使用new 操作符,你都会返回一个非函数对象。 Promise 不是函数。

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

    另外,你不需要定义 res 和 res 函数,它们是内置在 Promise 中的。 阅读 Promise API!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-15
      • 1970-01-01
      • 1970-01-01
      • 2014-10-21
      • 1970-01-01
      • 1970-01-01
      • 2015-07-14
      相关资源
      最近更新 更多