Javascript 无法提示基于回调的函数

Javascript 无法提示基于回调的函数,javascript,node.js,promise,node-promisify,Javascript,Node.js,Promise,Node Promisify,我想使用库,其中文档中的典型调用如下所示: const aztroJs = require("aztro-js"); //Get all horoscope i.e. today's, yesterday's and tomorrow's horoscope aztroJs.getAllHoroscope(sign, function(res) { console.log(res); }); const aztroJs = require("aztro-j

我想使用库,其中文档中的典型调用如下所示:

const aztroJs = require("aztro-js");

//Get all horoscope i.e. today's, yesterday's and tomorrow's horoscope
aztroJs.getAllHoroscope(sign, function(res) {
   console.log(res);
});
const aztroJs = require("aztro-js");
const {promisify} = require('util');
const getAllHoroscopeAsync = promisify(aztroJs.getAllHoroscope);

async function handle() {
  let result, sign = 'libra';
  try {
    result = await getAllHoroscopeAsync(sign);
  }
  catch (err) {
    console.log(err);
  }
  console.log("Result: " + result);
}
出于几个原因,我希望使用async/await样式并利用try/catch。所以我试着这样承诺:

const aztroJs = require("aztro-js");

//Get all horoscope i.e. today's, yesterday's and tomorrow's horoscope
aztroJs.getAllHoroscope(sign, function(res) {
   console.log(res);
});
const aztroJs = require("aztro-js");
const {promisify} = require('util');
const getAllHoroscopeAsync = promisify(aztroJs.getAllHoroscope);

async function handle() {
  let result, sign = 'libra';
  try {
    result = await getAllHoroscopeAsync(sign);
  }
  catch (err) {
    console.log(err);
  }
  console.log("Result: " + result);
}
然而,当我记录结果时,它是未定义的。我知道调用成功了,因为库正在通过console.log自动记录响应,并且我在日志中看到了正确的响应


我怎么能等这个电话?即使通过其他方式,如果这个函数不可预期,您也可以将getAllHoroscopeAsync更改为promise函数

例如:

const getAllHoroscopeAsync = (sign) => 
    new Promise(resolve => 
            aztroJs.getAllHoroscope(sign, (res) => resolve(res)));

您可以将getAllHoroscopeAsync更改为promise函数

例如:

const getAllHoroscopeAsync = (sign) => 
    new Promise(resolve => 
            aztroJs.getAllHoroscope(sign, (res) => resolve(res)));
util.promisify希望回调函数接受两个参数,第一个参数是错误,当没有错误时必须为null,当有错误时必须为非null,第二个参数是无错误时的值。只有当回调遵循特定规则时,它才会正确地提示函数

要解决这个问题,您必须手动承诺您的功能

// manually promisify
aztroJs.getAllHoroscopePromise = function(sign) {
    return new Promise(resolve => {
        aztroJs.getAllHoroscope(sign, function(data) {
            resolve(data);
        });
    });
};

// usage
aztroJs.getAllHoroscopePromise(sign).then(results => {
    console.log(results);
});
请注意,对于返回数据的异步函数来说,没有返回错误的方法是不寻常的,因此aztroJs.getAllOroscope接口在这方面似乎有点可疑

事实上,如果您查看,您可以看到它正在使用请求库发出网络请求,然后在出现错误时尝试抛出异步回调。这是一个完全有缺陷的设计,因为作为调用方的您无法捕获异步抛出的异常。因此,这个包没有合理的方式来传递回错误。它的设计很差。

util.promisify希望回调函数接受两个参数,第一个参数是错误,当没有错误时必须为null,当有错误时必须为非null,第二个参数是无错误时的值。只有当回调遵循特定规则时,它才会正确地提示函数

要解决这个问题,您必须手动承诺您的功能

// manually promisify
aztroJs.getAllHoroscopePromise = function(sign) {
    return new Promise(resolve => {
        aztroJs.getAllHoroscope(sign, function(data) {
            resolve(data);
        });
    });
};

// usage
aztroJs.getAllHoroscopePromise(sign).then(results => {
    console.log(results);
});
请注意,对于返回数据的异步函数来说,没有返回错误的方法是不寻常的,因此aztroJs.getAllOroscope接口在这方面似乎有点可疑


事实上,如果您查看,您可以看到它正在使用请求库发出网络请求,然后在出现错误时尝试抛出异步回调。这是一个完全有缺陷的设计,因为作为调用方的您无法捕获异步抛出的异常。因此,这个包没有合理的方式来传递回错误。它设计得很差。

试试定制的推荐功能

aztroJs.getAllHoroscope[util.promisify.custom] = (sign) => {
  return new Promise((resolve, reject) => {
    aztroJs.getAllHoroscope(sign, resolve);
  });
};

const getAllHoroscopeAsync = util.promisify(aztroJs.getAllHoroscope);

尝试自定义promisified函数

aztroJs.getAllHoroscope[util.promisify.custom] = (sign) => {
  return new Promise((resolve, reject) => {
    aztroJs.getAllHoroscope(sign, resolve);
  });
};

const getAllHoroscopeAsync = util.promisify(aztroJs.getAllHoroscope);

promisify需要一个回调,其中第一个参数是/the error。a确保正确获取方法的此上下文b确保该方法符合nodeback约定。const GetAllOroscopeAsync=promisifysign,cb=>{aztroJs.GetAllOroscopeSign,res=>{cbnull,res;};应该可以。你的代码似乎还可以。你如何调用你的handle方法?promisify需要一个回调,其中第一个参数是a/错误。a确保正确获取方法的此上下文b确保该方法符合nodeback约定。const getAllHoroscopeAsync=promisifysign,cb=>{aztroJs.getAllHorospesign,res=>{cbnull,res;};};应该可以工作。您的代码似乎正常。您如何调用handle方法??