我有一些使用节点-bing-api的代码。-它是错误的,并且工作非常完美的,但我想把它转换成使用承诺(和await
)。
我使用节点8和util.promisify
。在下面的代码中,Bing.web
是常规的错误优先代码,而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();
promisified失败的有:
(node:1752) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 2): TypeError: this.searchVertical is not a function
这是节点-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)
})
})
}
发布于 2017-07-12 17:48:29
它可能缺少上下文:函数Bing.web
在其体内使用this
,在使用util.promisify
时不绑定到Bing
。
您需要通过以下方法显式地绑定它:
searchBing = util.promisify(Bing.web.bind(Bing));
https://stackoverflow.com/questions/45064380
复制相似问题