【问题标题】:nodejs promisify a callback function with one parameter /callbacknodejs 承诺一个带有一个参数的回调函数 /callback
【发布时间】:2018-12-14 13:19:12
【问题描述】:

util.promisify 似乎总是期望回调函数有 2 个参数,但是现有函数没有针对错误和数据的单独回调,而只有一个回调。

我该如何处理???

const {promisify} = require('util');

function y(text,cb){
    setTimeout(function(){cb({error:false,data:text})},1000);   
}

async function test(text) {
  try{
    const z = promisify(y)
    return await z(text);
  } catch(e) {return {error:true,msg:e}} 
} 

console.log(test('xxx'));

我正在寻找的是从函数 y 同步返回值而不是得到承诺,即

var x = test('xxx');

【问题讨论】:

  • 那么当y出现错误时通常会发生什么(没有promisify?)
  • return await new Promise(resolve => y(q, resolve));
  • 如果你的回调只接受一个参数那你怎么知道什么时候有错误呢?
  • @PatrickRoberts - 因为在真正的函数中它总是回复 {error:true/false, data:....} - 这只是一个简单的测试来找出语法:-)
  • @FelixKling - 这会返回一个承诺,但我正在寻找的是返回结果而不是一个承诺。

标签: node.js promise


【解决方案1】:

给定the information in your comment,您可以使用兼容的签名包装函数以直接传递给promisify()

const { promisify } = require('util')

function y (query, callback) {
  callback(query)   
}

function yCompatible (query, callback) {
  y(query, ({ error, data }) => {
    callback(error && data, error || data)
  })
}

const yAsync = promisify(yCompatible)

async function test (query) {
  try {
    return yAsync(query)
  } catch (error) {
    return error
  } 
} 

test('xxx').then(
  data => { console.log(data) },
  error => { console.error(error) }
)

也尽量不要养成像数学家那样使用单字母变量的习惯;)我知道这只是示例代码,但即便如此,更明确地说明您的意图也会有所帮助。

【讨论】:

  • 谢谢,但问题是这是返回一个承诺,但我希望返回 y 回调返回的值,而不是一个承诺,因为它仍然不同步。
  • @crankshaft 那是不可能的。回调和承诺是处理将来可用的数据的两种方法。您无法将未来值的表示形式转换为值本身,您仍然需要在某个时候等待它。这就是为什么你不能只 return 它。见How do I return the response from an asynchronous call?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-17
  • 1970-01-01
相关资源
最近更新 更多