我很新編程(3個月),並且在節點處理異步函數(我認爲)時遇到問題。使用承諾節點異步GET請求的問題
我有一個Merchant類對象,它有一個方法「addMenu」,它可以從外部API對菜單進行GET請求,然後通過設置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並讓事情發揮作用,但是這並不能擊敗promise的全部目的?我一直被困在這個一般性的問題上 - 一直在研究回調,延遲,承諾等來解決它,但我想我可能會錯過一些更重要的思想。
謝謝!
編輯補充:
好以後的一切,我意識到,我的問題的真正關鍵是不能從回調/承諾內訪問this.data.menu導致我做的一切各種奇怪的東西,並試圖返回到這一點。變量等。
只需閱讀「var that = this;」欺騙獲得了類的範圍,這使得我所有的回調和承諾嘗試都能正常工作,並使我的頭腦更加有意義。我現在知道更多關於我曾經打算作爲副作用的承諾。感謝幫助人們!
承諾不奇蹟般地使異步代碼同步。他們只能簡化我們對異步的處理。 – Bergi