【问题标题】:es6-promise: promisify'ing httpntlm modulees6-promise:httpntlm 模块中的promisify
【发布时间】:2019-01-23 08:02:19
【问题描述】:

我想让httpntlm 模块返回一个promise,它通过回调实现。

这是一个带有回调的工作版本:

httpntlm.get({
  url,
  username: 'username',
  password: 'banana'
}, 
function (err, resx){
  if(err) console.log(err);
  else {
    console.log(resx.headers);
    console.log(resx.body);
  }
});

这是我试图让它返回承诺的方法:

promisify(httpntlm.post(config, (error, response) => {
  if (error) return errro
  return response
}))
.then(res => console.log(res))
.catch(err => console.log(err))

但是promisify版本返回错误:

UnhandledPromiseRejectionWarning:TypeError [ERR_INVALID_ARG_TYPE]:“原始”参数必须是函数类型。接收类型未定义

我错过了什么?谢谢

【问题讨论】:

  • 尝试删除箭头函数内的返回。并像这样写 promisify(httpntlm.post(config, (error, response) => { if (error) errro response }))

标签: node.js promise async-await es6-promise


【解决方案1】:

这就是docs say to util.promisify

util.promisify(original)

  • 原创<Function>
  • 返回:<Function>

如错误消息所述

“原始”参数必须是函数类型,接收类型未定义

你做了什么:

promisify(httpntlm.post(config, (error, response) => {
  if (error) return error
  return response
}))

你已经调用了这个函数。而httpntlm.post 是一个异步函数,它什么也不返回。

你应该通过这个函数:

var httpntlmPostAsync =  promisify(httpntlm.post);

// if `post` depends on `this`
var httpntlmPostAsync =  promisify(httpntlm.post.bind(httpntlm));

就是这样。

换句话说,promisify 不会为您调用函数,也不会对正在运行的函数调用应用任何魔法。它创建了一个行为不同的新函数

httpntlmPostAsync({
  url: 'url',
  username: 'username',
  password: 'banana'
})
.then(res => console.log(res))
.catch(err => console.log(err))

或者,如果你更喜欢这样:

async function foo() {
  try {
    var res = await httpntlmPostAsync({
      url: 'url',
      username: 'username',
      password: 'banana'
    });
    console.log(res);
  } catch (err) {
    console.log(err);
  }
}

要promisify多个功能,你可以使用这样的东西:

['get', 'post', 'etc'].forEach(method => 
    httpntlm[method + 'Async'] = promisify(httpntlm[method].bind(httpntlm))
);

之后,httpntlm.getAsynchttpntlm.postAsync等可用。

【讨论】:

  • 关于这个的好文章是here
猜你喜欢
  • 2021-12-29
  • 2018-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-18
  • 2014-10-09
  • 2017-01-04
相关资源
最近更新 更多