node.js - 功能有效,但在使用 util.promisify() 时失败?

标签 node.js promise async-await

我有一些使用 node-bing-api 的代码. 这是错误优先且完美运行,但我想将其转换为使用 Promises(和 await)。

我正在使用 Node 8 和 util.promisify。在下面的代码中,Bing.web 是常规的 err-first 代码,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();

promise 的版本失败:

(node:1752) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 2): TypeError: this.searchVertical is not a function

这是 node-bing-api 内部的错误。但是 util.promisify 不应该使用与原始函数相同的参数无缝地将选项传递给真正的 bing.web 吗?

为什么这个函数在promisified时不起作用?

请注意,我可以制作自己的 promise 版本 - 可行 - 但我不想创建额外的代码:

var searchBing = function(){
  return new Promise(function(resolve, reject) {
    Bing.web('windows', {top: 5}, function(err, searchResults){
      if ( err ) {
        reject(err)
        return
      }
      resolve(searchResults)
    })
  })
}

最佳答案

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

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

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

关于node.js - 功能有效,但在使用 util.promisify() 时失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45064380/

相关文章:

javascript - 如何在用作nodejs服务器响应的html文件中包含外部脚本

javascript - Promise 队列中的 Bluebird-Queue 并发未按预期工作

node.js - 使用 npm install 时出错 (npm ERR! Windows_NT 6.3.9600 )

node.js - 在循环 Node js中执行多个函数后如何调用另一个函数

javascript - 如何防止嵌套的 Promise 挂起?

javascript - 我有几组 promise ,如何解析每组 "sequentially"?

javascript - 需要在http响应后运行该变量

javascript - 如何让 JavaScript 类方法等待构造函数中的数据加载后才返回数据?

Javascript - 从 AWS s3 存储桶中读取 Parquet 数据(使用 snappy 压缩)

javascript - 异步问题,无法在 .then 之后运行 shelljs 命令