【发布时间】:2016-02-14 11:01:48
【问题描述】:
我对编程非常陌生(3 个月),并且在节点如何处理异步函数方面遇到了麻烦(我认为)。
我有一个带有方法“addMenu”的 Merchant 类对象,该方法从外部 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) 时,我得到“{ state: 'pending' }”。我可以做 setTimeout 并让事情正常工作,但这不会违背承诺的全部目的吗?几天来,我一直被这个普遍的问题所困扰——一直在研究回调、延迟、承诺等来解决它,但我认为我可能错过了一些更基本的想法。
谢谢!
编辑添加:
毕竟我意识到我的问题的真正症结在于无法从回调/承诺内部访问 this.data.menu 这导致我做各种奇怪的事情并试图将它们返回到这。变量等。
只需阅读“var that = this;”访问类范围的技巧,这使我所有的回调和承诺尝试都可以正常工作,并且在我的脑海中变得更有意义。而且我现在知道了更多关于我曾经打算作为附带好处的承诺。感谢大家的帮助!
【问题讨论】:
-
Promise 不会神奇地使异步代码同步。它们只能简化我们对异步的处理。
标签: javascript node.js asynchronous q npm-request