0

出于某种原因,我的 for of 循环在 1 次迭代后继续停止。

我希望得到一个包含 2 个资产 ID 和 2 个价格的 console.log,但是我只得到 1 个资产 ID 和 1 个价格。然后,我可以获得适合的响应的唯一方法是当我通过刷新重新运行函数时(b/c 它检查我的 localStorage 并看到旧值已经存在)任何想法为什么它在一次迭代后停止?

   main = async () => {
        await eth.connect({
          provider: "https://mainnet.infura.io/[key-goes-here]",
          contracts: [landRegistry, marketplace]
        });


    const response = await axios.get(
      "https://api.decentraland.org/parcels?status=open"
    );
    const viableProperties = response.data.data.parcels.filter(parcel => parcel.publication.price <= this.state.landPrice);
    for(let [key, value] of viableProperties.entries()) {
      const cost = value.publication.price;
      const asset = value.publication.asset_id;
      const commaPos = asset.indexOf(",");
      const coordinatesLat = parseFloat(asset.substring(0, commaPos));
      const coordinatesLong = parseFloat(
        asset.substring(commaPos + 1, asset.length)
      );
      const price = eth.utils.toWei(cost);
      const oldProperty = localStorage.getItem(asset)
      if (cost <= this.state.landPrice && oldProperty == null) {
        localStorage.setItem(asset, key);
        const assetId = await landRegistry.encodeTokenId(
          coordinatesLat,
          coordinatesLong
        );
        await marketplace.executeOrder(assetId, price)
      }
    } 
  };

**** 编辑 **** - 我目前有 await marketplace.executeOrder ...我曾经有 console.log(asset, price)

4

1 回答 1

1

所以,现在你已经向我们展示了真实的代码:

await marketplace.executeOrder(assetId, price)

在其中,有一个合理的理由让for循环停止。如果 promisemarketplace.executeOrder()返回、拒绝或抛出同步异常,则async函数将立即拒绝它的 promise 并停止进一步执行任何操作。

如果您希望即使该承诺失败也继续循环,您可以使用 atry/catch或 a捕获被拒绝的承诺.catch()


请将此作为未来的建议,以在问题中包含尽可能多的真实代码。如果您遗漏了您认为不属于问题的部分,您可能只是在向试图帮助您的人隐瞒真正的问题(这种情况经常发生,这确实会降低我们提供帮助的能力)。

于 2018-07-31T03:52:49.207 回答