Я очень новичок в программировании (3 месяца), и у меня возникают проблемы с тем, как узел обрабатывает асинхронные функции (я думаю).Проблема с узлом асинхронного запроса GET с использованием обещаний
У меня есть объект класса Merchant с методом «addMenu», который делает запрос GET для меню из внешнего API, а затем обновляет продавца, установив объект merchant.data.menu (который по умолчанию равен null) новое меню, которое мы только что получили.
код в вопросе:
this.addMenu = function(currentMerchant) {
var id = currentMerchant.id;
function getMenu(id) {
var deferred = Q.defer();
var url = 'https://api.delivery.com/merchant/'+id+'/menu?client_id=xyz';
request.get(url, function(error, response, body) {
if(error) {
console.log("Something went wrong with menu GET request: Status Code: " + response.statusCode);
deferred.reject(new Error(error));
} else if(!error && response.statusCode == 200) {
menuObj = JSON.parse(body);
deferred.resolve(menuObj);
}
});
return deferred.promise;
};
this.data.menu = getMenu(id).then(function(currentMenu) {
return currentMenu;
});
console.log(this.data.menu);
};
При входе (this.data.menu), я получаю "{состояние: 'в ожидании'}." Я могу сделать setTimeout и заставить работать, но разве это не побеждает целую цель обещаний? Я застрял в этой общей проблеме в течение нескольких дней - вникал в обратные вызовы, задержки, обещания и т. Д., Чтобы решить эту проблему, но думаю, что, возможно, мне не хватает чего-то более фундаментального в моем мышлении.
Спасибо!
Изменить, чтобы добавить:
Ну в конце концов я понял, что реальная суть моей проблемы была невозможность доступа this.data.menu изнутри обратного вызова/обещания, которые приводят меня делать все виды странных вещей и попытки вернуть их в это. переменная и т. д.
Просто прочитайте «var that = this;» трюк, чтобы получить доступ к классу, который сделал все мои обратные вызовы и обещания попытками работать нормально и сделать sooo гораздо больше смысла в моей голове. И теперь я знаю намного больше о обещаниях, которые я когда-либо планировал в качестве побочной выгоды. Спасибо за помощь людям!
Обещания не магически делают синхронный асинхронный код. Они могут только упростить наше лечение асинхронности. – Bergi