承诺拒绝给我一个UnhandledPromiseRejectionWarning错误

时间:2019-06-05 04:53:55

标签: javascript node.js promise

有人可以向我解释为什么我在做错吗?如何正确解决此问题?

我有以下代码可以执行交易:

async function limitOrder(keys, symbol, type, quantity, price, waitResult) {

var client = await loadKeys(keys);
return new Promise((resolve, reject) => {
    client.newOrder({
        symbol: symbol,
        side: type, //BUY OR SELL
        type: 'LIMIT',
        quantity: quantity,
        price: price,
        timeInForce: "GTC",
        newOrderRespType: 'RESULT'
    }).then(async (response) => {
        console.log(response);
        resolve({order: response, price: response.price, quantity: response.origQty}); //return back the order ID
        }
    }).catch((err) => {
        console.log(err); //print error if any
        reject(err);
    });
});

}

这是我第一次编写Promise函数的方式,并且在reject(err)行中遇到错误。因此,如果订单正确执行,则resolve()确实会将订单返回给调用此订单的函数。但是,如果到达catch块,则会打印错误。但是,reject行却给了我这个错误:

UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch().

我想做的是返回错误并在另一个函数中处理它(称为此函数)。

3 个答案:

答案 0 :(得分:0)

limitOrder返回的新Promise的执行者中,存在一个带有catch返回的Promise值的Promise链。链中没有任何其他承诺,也不能添加任何承诺(在limitOrder之外看不到承诺链)。

在catch处理程序中引发错误时,catch所返回的promise将被拒绝,没有拒绝处理程序,并生成未捕获的拒绝错误。

一种解决方案是通过适当的修改从limitOrder返回承诺链,以确保成功后以正确的值进行解析:

async function limitOrder(keys, symbol, type, quantity, price, waitResult) {

  var client = await loadKeys(keys);
  return client.newOrder({
    symbol: symbol,
    side: type, //BUY OR SELL
    type: 'LIMIT',
    quantity: quantity,
    price: price,
    timeInForce: "GTC",
    newOrderRespType: 'RESULT'
    })
   .then((response) => {
        console.log(response);
        return {order: response, price: response.price, quantity: response.origQty}); //return back the order ID
        }
    }).catch((err) => {
        console.log(err); //print error if any
        reject(err);
    });
  });

}

如果.then处理函数是完全同步的,则不需要将其声明为async。显然,如果由于将来的修改而有必要将tt放回去。

答案 1 :(得分:0)

问题出在client.newOrder( ... )方法中,您可能在其中还有一个可能会在then方法中引发错误的承诺,例如:

return new Promise((resolve, reject) => {

  if ("type" in p) {

    Promise.resolve(1)
      .then((r) => {
      
        throw new Error('here is your uncatched error');
        
        resolve(r)
      })

  } else {
    reject(new Error('special fail')) // this is how to handle Errors
  }


})

答案 2 :(得分:0)

我刚刚更新了您的代码,以使用async / await代替了promise和try-catch块来处理错误。检查一下:

async function limitOrder(keys, symbol, type, quantity, price, waitResult) {
  try {
    var client = await loadKeys(keys);
    let response = await client.newOrder({
      symbol: symbol,
      side: type,
      type: 'LIMIT',
      quantity: quantity,
      price: price,
      timeInForce: "GTC",
      newOrderRespType: 'RESULT'
    })
    console.log(response);
    return { order: response, price: response.price, quantity: response.origQty }; //return back the order ID
  } catch (err) {
    console.log(err);
    throw new Error(err.message);
  };
}