【问题标题】:How do I make a promise call to a third party server?如何向第三方服务器发出 Promise 调用?
【发布时间】:2020-02-06 12:59:55
【问题描述】:

我正在尝试调用外联网,它应该返回一个参数,但 api 不等待它。

Orders.prototype.add = function (data, db, callback, logger) {
    var extranet = new API_EXTRANET();
    extranet.addOrder(data, function(err, orders) {
        if (!err) {
            if(callback) callback(false, orders);
        }else{
            if(callback) callback(err, false);
        }
    }, logger);
};

我试图返回它的 Promise 但没有任何反应。

Orders.prototype.add = function (data, db, callback, logger) {
    var extranet = new API_EXTRANET();
    return new Promise((resolve, reject) => {
        extranet.addOrder(data, function(err, orders) {
            if (err){
                reject(err)
            } else {
                resolve(orders)
            }
        })
    })
};

这里是我调用方法的地方:

order.addStoreOrder(order_data_update, db).then((response) => {
                                                            order.add(array_data, db, function (err, order_response) {

【问题讨论】:

  • 如何调用方法? (在那里你需要等待结果。)
  • await order.add(array_data, db, function (err, order_response) { //logic } 它不接受 await @RolandStarke
  • @josh 你没有传递记录器来添加函数?
  • @SanketPhansekar 并非如此

标签: node.js extranet


【解决方案1】:

您正在混合处理异步调用的不同方式:回调和承诺。你应该只信守诺言。

// There is no need for callback here, the promise replace your callback
// Because you use of await I guess you should use it here as well
Orders.prototype.add = async (data) => {
  const extranet = new API_EXTRANET();

  return util.promisify(extranet.addOrder)(data);
};

// How to call it
try {
  const orders = await order.add(arrayData);
} catch (err) {
  // Handle the error
}

如果你想包装 addOrder 返回,你可以这样做:

Orders.prototype.add = async(data) => {
  const extranet = new API_EXTRANET();

  try {
    const orders = await util.promisify(extranet.addOrder)(data);

    console.log(orders);

    return orders;
  } catch (err) {
    console.error(err);

    throw new Error('custom error');
  }
};

// How to call it
try {
  const orders = await order.add(arrayData);
} catch (err) {
  // Handle the error
}

文档util.promisify()

说明:将使用回调的函数转换为 Promise 函数

【讨论】:

  • 还是不等待参数
  • order.addStoreOrder(order_data_update, db).then((response) => { order.add(array_data, db, function (err, order_response) { 这里是我调用它的地方
  • 还是不好,而且不像我给你看的那样。你仍然混淆了回调和承诺
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-08
  • 1970-01-01
  • 1970-01-01
  • 2022-11-23
  • 2021-06-07
  • 1970-01-01
相关资源
最近更新 更多