首页 > 解决方案 > 访问 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;
        }
      });
    });

标签: node.jspromise

解决方案


这个问题被问了很多,但希望用你自己的问题的术语来解释它会帮助你理解。

您的代码应该等待任何可能性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 将“通过”结果传回,而不是使用更高范围的变量。


推荐阅读