【问题标题】:Function works, but fails when util.promisify() used?功能有效,但在使用 util.promisify() 时失败?
【发布时间】: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)
    })
  })
}

【问题讨论】:

标签: node.js promise async-await


【解决方案1】:

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

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

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

【讨论】:

  • 谢谢。确认这可以完美运行,并且是导致奇怪错误的原因。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-14
  • 2015-01-12
  • 1970-01-01
  • 2021-08-15
相关资源
最近更新 更多