gpt4 book ai didi

javascript - 使用 Promise 的 Node 异步 GET 请求出现问题

转载 作者:太空宇宙 更新时间:2023-11-04 02:20:26 25 4
gpt4 key购买 nike

我对编程非常陌生(3个月),并且在 Node 如何处理异步函数方面遇到了麻烦(我认为)。

我有一个带有“addMenu”方法的 Merchant 类对象,该对象从外部 API 发出对菜单的 GET 请求,然后通过将商户.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 并使事情正常工作,但这是否违背了 promise 的全部目的?我已经被这个普遍问题困扰好几天了——一直在深入研究回调、延迟、 promise 等来解决它,但我想我可能在我的想法中遗漏了一些更基本的东西。

谢谢!

编辑以添加:

毕竟,我意识到问题的真正症结是无法从回调/ promise 内部访问 this.data.menu,这导致我做各种奇怪的事情并试图将它们返回到 this 中。变量等

只需阅读“var that = this;”即可获取类作用域访问权限的技巧,这使得我所有的回调和 promise 尝试都能正常工作,并且在我的脑海中变得更有意义。现在,我对那些我曾经打算作为附带利益的 promise 有了更多的了解。感谢大家的帮助!

最佳答案

then 方法的返回仍然是一个 promise ,因此不会被实现。一开始这是一个很难理解的范例。 (玩过传送门吗?:))

我想你想做这样的事情

getMenu(id).then(function(currentMenu) {
this.data.menu = currentMenu;
});

其中的关键部分是您在履行 promise 时调用的函数内进行分配。

除此之外的任何代码都不能保证在 promise 返回后运行(这就是您获得控制台输出的原因)

关于javascript - 使用 Promise 的 Node 异步 GET 请求出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33683000/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com