函数有效,但在使用util.promisify()时失败了?

时间:2017-07-12 17:44:11

标签: node.js promise async-await

我有一些使用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)
    })
  })
}

1 个答案:

答案 0 :(得分:21)

可能缺少上下文:函数Bing.web在其正文中使用this,在使用Bing时未绑定到util.promisify

您需要通过以下方式明确绑定它:

searchBing = util.promisify(Bing.web.bind(Bing));