node.js - node.js util.promisify 是如何工作的?如何将 cb 样式转换为 promise 样式?
问题描述
我有以下练习:
const { promisify } = require('util')
const print = (err, contents) => {
if (err) console.error(err)
else console.log(contents)
}
const opA = (cb) => {
setTimeout(() => {
cb(null,'A')
}, 500)
}
const opB = (cb) => {
setTimeout(() => {
cb(null, 'B')
}, 250)
}
const opC = (cb) => {
setTimeout(() => {
cb(null, 'C')
}, 125)
}
在不修改函数和 cb 的情况下,是否可以使用 Promisify 将其转换为基于 Promise 的?
更新。我尝试了这个解决方案,但它没有按我的预期工作。打印顺序是 CBA,而我期待的是 ABC
const promA = promisify(opA)
const promB = promisify(opB)
const promC = promisify(opC)
promA(print).then(promB(print)).then(promC(print))
更新二。已解决,谢谢大家:
const promiseA = promisify(opA);
const promiseB = promisify(opB);
const promiseC = promisify(opC);
Promise.all([promiseA(),promiseB(),promiseC()]).then((res)=>{
res.map(val => print(null,val))
})
解决方案
我尝试了这个解决方案,但它不像我预期的那样工作:
promA(print).then(promB(print)).then(promC(print))
承诺功能后,您不再应该传递回调 - 它是
promA().then(console.log, console.error);
为了对它们进行排序,请注意您仍然需要将函数传递给.then()
,而不是承诺 - 所以它是
promA().then(resA => {
console.log(resA);
return promB();
}).then(resB => {
console.log(resB);
return promC();
}).then(resC => {
console.log(resC);
}).catch(err => {
console.error(err);
});
或展平为
promA().then(console.log).then(promB).then(console.log).then(promC).then(console.log).catch(console.error);
请注意,print
带有(error, result) => void
签名的函数仅适用于具有 node.js 回调约定的异步函数,不适用于 promise,这就是我在上面的示例中直接console.log
调用的原因。console.error
错误处理更好地分离,并且与承诺不同。
推荐阅读
- java - 按频率对文本文件中的单词进行排序
- xslt - 如何使用 XSLT 遍历字母表?
- java - JMeter压力测试TPS无法提高
- databricks - 我可以强制刷新 Databricks Delta 表,以便磁盘副本具有最新/一致的数据吗?
- eclipse - cucumber.runtime.CucumberException: java.lang.NullPointerException
- vert.x - 使用 Vert.x-redis 和 Quarkus 构建本机映像的问题
- c# - C# UWP 如何更改 TextBox 的前景
- python-3.x - 如何将列表与文件名匹配,然后将匹配的文件移动到 Python 中的新目录?
- c# - SQLite DB:使用 LINQ 创建一个 SQL 语句,该语句使用同一个表两次但没有 CROSS JOIN
- ruby-on-rails - 我如何在 Rails(Web Scraping)中写出永无止境的工作?