node.js - 访问 Promise 之外的变量
问题描述
我正在编写一个蒸汽机器人,并试图检查交易中的一件物品的价值是否低于 1 美元。我需要访问“pass”变量,但它永远不会起作用。有人可以帮忙吗?
var receive = offer.itemsToReceive;
var pass = true;
receive.forEach(function(id) {
var args = id.split(",");
market.getItemPrice("some app id", some item name).then(function(result) {
var json = JSON.parse(JSON.stringify(result)); // returns e.G $0.08
var price = parseFloat(json.median_price.substring(1));
if(price*100 < 100) {
pass = false;
}
});
});
解决方案
这个问题被问了很多,但希望用你自己的问题的术语来解释它会帮助你理解。
您的代码应该等待任何可能性pass = false;
,但不是因为您调用了异步函数——想象一下代码在调用之后立即继续前进。您的 foreach 函数会立即被处理并调用下一行,直到.getItemPrice
稍后响应。
因此,要“等待”所有结果,您可以执行以下操作:
var receive = offer.itemsToReceive;
var pass = true;
var itemReceivePromises = receive.map(id=>{
var args = id.split(",");
return market.getItemPrice("some app id", some item name).then(function(result) {
var json = JSON.parse(JSON.stringify(result)); // returns e.G $0.08
var price = parseFloat(json.median_price.substring(1));
if(price*100 < 100) {
pass = false;
}
});
});
Promise.all(itemRecievePromises).then(results=>{
console.log('pass',pass);
});
但是,您应该通过 Promise 将“通过”结果传回,而不是使用更高范围的变量。
推荐阅读
- javascript - 了解原型链是如何工作的?
- html - PhpStorm 无法正确识别 HTML 标签
- python - 从两个for循环python获取x,y值
- wordpress - 如何在我的网站上查看和下载私人视频(在私人 Pro Vimeo 个人资料上)?
- javascript - 如何从中获取特定的密钥?
- java - Mac JDK11:线程“主”java.lang.NoClassDefFoundError 中的异常:java/sql/SQLException
- python - 为什么我的 keras 模型根本不训练?
- r - 无法使用 plot_ly 函数绘制图形
- java - 在 Flux 平面图中处理 Mono
- c# - 执行程序时如何纠正错误“字符串未被识别为有效的日期时间”?