【发布时间】:2017-12-17 06:39:06
【问题描述】:
我有一些使用node-bing-api 的代码。 这是错误优先且完美运行,但我想将其转换为使用 Promises(和 await)。
我正在使用节点 8 和 util.promisify。在下面的代码中,Bing.web 是常规的 err-first 代码,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,使用与原始函数相同的参数吗?
为什么这个函数在promised时不起作用?
请注意,我可以制作自己的承诺版本 - 可行 - 但我不想创建额外的代码:
var searchBing = function(){
return new Promise(function(resolve, reject) {
Bing.web('windows', {top: 5}, function(err, searchResults){
if ( err ) {
reject(err)
return
}
resolve(searchResults)
})
})
}
【问题讨论】:
-
@zubair1024 在那篇文章中是否有任何关于绑定或 thisContexts 的内容,或者您是否在发送垃圾邮件?
标签: node.js promise async-await