有人可以向我解释为什么我在做错吗?如何正确解决此问题?
我有以下代码可以执行交易:
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().
我想做的是返回错误并在另一个函数中处理它(称为此函数)。
答案 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);
};
}