我有一些使用node-bing-api的代码。 这是错误的 - 并且完美无缺,但我想将其转换为使用Promises(和await
)。
我正在使用节点8和util.promisify
。在下面的代码中,Bing.web
是常规的错误优先代码,searchBing
是宣传的版本。
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();
宣传版失败了:
(node:1752) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 2): TypeError: this.searchVertical is not a function
这是node-bing-api中的错误。但是util.promisify
不应该使用与原始函数相同的参数无缝地将选项传递给真实bing.web
吗?
为什么这个功能在宣传时不起作用?
注意我可以制作自己的promisifed版本 - 这有效 - 但我不想创建额外的代码:
var searchBing = function(){
return new Promise(function(resolve, reject) {
Bing.web('windows', {top: 5}, function(err, searchResults){
if ( err ) {
reject(err)
return
}
resolve(searchResults)
})
})
}
答案 0 :(得分:21)
可能缺少上下文:函数Bing.web
在其正文中使用this
,在使用Bing
时未绑定到util.promisify
。
您需要通过以下方式明确绑定它:
searchBing = util.promisify(Bing.web.bind(Bing));