Приложение NodeJS. Есть вот такой кусочек кода:
var isAccepted;
offers.getOffer({tradeOfferId: offer.tradeofferid}, function (err, o) {
if (err || (o == null) || (typeof o.response.offer.trade_offer_state == "undefined")) {
helper.msg('Cant load offer state. It can be accepted, but we cant check it. Returning');
isAccepted = false;
return;
}
if (o.response.offer.trade_offer_state == "3") {
isAccepted = true;
}
else {
isAccepted = false;
}
return;
});
if (!isAccepted) {
io.emit('tradeoffer-msg', { steamid: offer.steamid_other, type: 6 });
return;
}
Проблема в том, что if (!isAccepted) выполняется раньше, чем мы получаем результат от сервера в offers.getOffer.
Я, конечно, мог бы поместить
if (!isAccepted) {
io.emit('tradeoffer-msg', { steamid: offer.steamid_other, type: 6 });
return;
}
в offers.getOffer, но тогда return будет работать на безымянную функцию в offers.getOffer, а не "снаружи" как мне и нужно.
Вопрос: как заставить приложение ждать ответа в данном случае?
Ответ
Асихронный return вы не сделаете, так не бывает. Приведите больше кода, т.к. проблема не в этом кусочке. Вам нужно вместо return использовать callback функцию в каком-либо варианте
var isAccepted;
offers.getOffer({tradeOfferId: offer.tradeofferid}, function (err, o) {
if (err || (o == null) || (typeof o.response.offer.trade_offer_state == "undefined")) {
helper.msg('Cant load offer state. It can be accepted, but we cant check it. Returning');
isAccepted = false;
return;
}
if (o.response.offer.trade_offer_state == "3") {
isAccepted = true;
}
else {
isAccepted = false;
}
if (!isAccepted) {
io.emit('tradeoffer-msg', { steamid: offer.steamid_other, type: 6 });
callback()
}
});
P.S. Можно конечно сделать так, чтоб этот код выполнялся как будто синхронно, но такие штуки пишут раки для крабов.
Комментариев нет:
Отправить комментарий