我有一些使用 node-bing-api 的代码. 这是错误优先且完美运行,但我想将其转换为使用 Promises(和 await
)。
我正在使用 Node 8 和 util.promisify
。在下面的代码中,Bing.web
是常规的 err-first 代码,searchBing
是 promisified 版本。
var findParentDir = require('find-parent-dir'),
configDir = findParentDir.sync(__dirname, 'config.js'),
config = require(configDir+'config.js'),
util = require('util'),
log = console.log.bind(console),
Bing = require('node-bing-api')({ accKey: config.cognitiveServices.bingSearch }),
searchBing = util.promisify(Bing.web);
var start = async function(){
// This fails
// var searchResultsRaw = await searchBing('windows', {top: 5})
// log(searchResultsRaw)
// This works
Bing.web('windows', {top: 5}, function(err, searchResultsRaw){
log(searchResultsRaw)
})
};
start();
promise 的版本失败:
(node:1752) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 2): TypeError: this.searchVertical is not a function
这是 node-bing-api 内部的错误。但是 util.promisify
不应该使用与原始函数相同的参数无缝地将选项传递给真正的 bing.web
吗?
为什么这个函数在promisified时不起作用?
请注意,我可以制作自己的 promise 版本 - 可行 - 但我不想创建额外的代码:
var searchBing = function(){
return new Promise(function(resolve, reject) {
Bing.web('windows', {top: 5}, function(err, searchResults){
if ( err ) {
reject(err)
return
}
resolve(searchResults)
})
})
}
最佳答案
可能缺少上下文:函数 Bing.web
在其主体中使用 this
,而在使用 util.promisify
.
您需要通过以下方式显式绑定(bind)它:
searchBing = util.promisify(Bing.web.bind(Bing));
关于node.js - 功能有效,但在使用 util.promisify() 时失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45064380/