首页 > 解决方案 > 为什么 promisify 不想要回调函数的参数?

问题描述

下面的脚本有效,但我不明白为什么不需要

const a = promisify(opA());

而不是(正确的)

const a = promisify(opA);

我的意思opA是一个函数,那为什么不opA()呢?

'use strict'
const { promisify } = require('util')

const opA = (cb) => {
  setTimeout(() => {
    cb(null, 'A')
  }, 500)
}

const opB = (cb) => {
  setTimeout(() => {
    cb(null, 'B')
  }, 250)
}

const opC = (cb) => {
  setTimeout(() => {
    cb(null, 'C')
  }, 125)
}

const a = promisify(opA);
const b = promisify(opB);
const c = promisify(opC);

(async function() {
  try {
    console.log(await a());
    console.log(await b());
    console.log(await c());
  } catch(err) {
    print(err);
  };
})();

标签: javascriptnode.jsecmascript-6async-await

解决方案


我的意思opA是一个函数,那为什么不opA()呢?

因为opA是对函数本身的引用。Promise 将使用该引用在以后执行该函数。

或者,现在opA()执行该函数(不带任何参数)并将该函数调用的结果传递给 Promise。由于您的函数不返回任何内容,因此它将传递给 Promise。然后,promise 在完成其操作后将不再执行任何操作。然后也会失败,因为is also ,因为没有参数传递给.opAundefinedsetTimeoutcbundefinedopA()

任何时候你看到这样的结构,要么(1)它是一个错误,要么(2)函数故意构建并返回一个用于承诺的回调函数。例如,如果您编写一个返回 opA的函数,那么您可以调用该函数并将其结果传递给promisify.


这种行为的一个重要线索在这里:

const opA = ...

opA是一个变量,与任何其他变量不同。它包含一个值或对某事物的引用。在这种情况下,它是对函数的引用。您可以重新分配该变量,将其作为函数参数传递,将其设置为对象的属性等,就像其他任何变量一样。


推荐阅读