Обещание отклонить, дав мне ошибку UnhandledPromiseRejectionWarning - PullRequest
1 голос
/ 05 июня 2019

Может кто-нибудь объяснить мне, почему то, что я делаю, неправильно? Как правильно решить эту проблему?

У меня есть этот код для совершения сделки:

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 голосов
/ 05 июня 2019

Проблема заключается в методе 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
  }


})
0 голосов
/ 05 июня 2019

Я только что обновил ваш код, чтобы использовать async / await вместо обещания и блока 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);
  };
}
0 голосов
/ 05 июня 2019

В исполнителе нового Обещания, возвращенного limitOrder, есть цепочка обещаний со значением обещания, возвращенного catch.Цепочка не содержит никаких дополнительных обещаний и не может быть добавлена ​​(цепочка обещаний не видна за пределами limitOrder).

Когда в обработчике перехвата возникает ошибка, обещание возвращаетсяcatch отклоняется, не имеет обработчика отклонения и генерирует необработанную ошибку отклонения.

Решением будет возврат цепочки обещаний из 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 можно вернуть обратно, если это станет необходимым из-за будущих модификаций.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...