javascript - 为什么 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);
};
})();
解决方案
我的意思
opA
是一个函数,那为什么不opA()
呢?
因为opA
是对函数本身的引用。Promise 将使用该引用在以后执行该函数。
或者,现在opA()
执行该函数(不带任何参数)并将该函数调用的结果传递给 Promise。由于您的函数不返回任何内容,因此它将传递给 Promise。然后,promise 在完成其操作后将不再执行任何操作。然后也会失败,因为is also ,因为没有参数传递给.opA
undefined
setTimeout
cb
undefined
opA()
任何时候你看到这样的结构,要么(1)它是一个错误,要么(2)函数故意构建并返回一个用于承诺的回调函数。例如,如果您编写一个返回 opA
的函数,那么您可以调用该函数并将其结果传递给promisify
.
这种行为的一个重要线索在这里:
const opA = ...
opA
是一个变量,与任何其他变量不同。它包含一个值或对某事物的引用。在这种情况下,它是对函数的引用。您可以重新分配该变量,将其作为函数参数传递,将其设置为对象的属性等,就像其他任何变量一样。
推荐阅读
- azure-table-storage - 如何在 Azure 数据工厂查找中针对表存储添加参数以进行查询
- r - 将电子邮件保存到 R 中的本地文件夹
- java - JDK14 无法运行“java --add-opens”
- clojurescript - 如何在测试套件中包含 cljs.spec 的函数 (Redux)
- spring-boot - 容器化的 spring 应用程序看不到本地文件?
- nginx - 如何在 Ubuntu-18 nginx 中强制更新 SSL 证书
- flask - 如何设置 wtform RadioField 的样式
- python - Python,Pandas:检查列的列表值中的每个元素是否存在于其他数据框中
- angular - 我是否必须将可观察对象明确定义为“有限”?
- python - 有没有办法以 JSON 值传递 Python 命令行