在为Node编写一些数字Javascript代码时,想到了“为什么不让这个异步?”如,
var mySquare = function(x, callback) {
callback(null, x * x);
}
mySquare(3, function(err, res) { console.log(res); });
// prints 9
除了计算更复杂,并且可能引发错误。
如何在不重写使用承诺的情况下宣传此功能?使用bluebird's promisify,通过var promisedSquare = Promise.promisify(mySquare)
,返回错误堆栈:
TypeError: undefined is not a function
at l (/path/bluebird.min.js:30:15474)
at Function.e.promisify (/path/bluebird.min.js:30:16031)
at repl:1:30
...
看起来蓝鸟几乎试图评估mySquare
。我已经毫不费力地宣传像d3.json
(包装XHR)这样的库函数,所以我很困惑:除了回调驱动的异步函数之外,我还需要提供蓝鸟吗?
答案 0 :(得分:1)
感谢所有评论的人:我会将你的阐述浓缩成一个答案来解决这个问题。
错误一定是我自己的节点配置错误,因为代码片段在浏览器中工作,并且在npm重新安装之后也在节点中工作。
但问题突出了异步操作与延续传递风格的错误理解。我现在明白,Javascript运行时只能隐藏磁盘或网络提取的延迟,或者更常见的是,当它等待自身以外的其他东西时。如果运行时必须进行大量计算,那么它就可以做到:它无法神奇地暂停数字计算的中间步骤来服务,比如网络请求。