Страницы

Поиск по вопросам

вторник, 16 июля 2019 г.

Как сделать это асинхронным?

Приложение 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. Можно конечно сделать так, чтоб этот код выполнялся как будто синхронно, но такие штуки пишут раки для крабов.

Комментариев нет:

Отправить комментарий