由于某种原因,我的for循环在1次迭代后继续停止。
我期望得到一个console.log,其中包含2 assetId和2个价格,但是相反,我仅获得了1 assetId和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)
}
}
};
****编辑****-我目前在那儿等待marketplace.executeOrder ...我曾经有console.log(asset,price)
答案 0 :(得分:1)
因此,既然您已经向我们展示了带有以下内容的真实代码:
await marketplace.executeOrder(assetId, price)
其中似乎有一个for
循环停止的合理原因。如果marketplace.executeOrder()
的承诺返回,拒绝或引发同步异常,则async
函数将立即拒绝其承诺并停止进一步执行任何操作。
如果您希望即使承诺失败也能继续循环,则可以使用try/catch
或.catch()
来捕获被拒绝的承诺。
请将此作为将来的建议,以在问题中包含尽可能多的真实代码。如果您遗漏了您认为不是问题的一部分,那么您可能只是向试图帮助您的人员隐藏了真正的问题(这种情况在这里经常发生,这确实减慢了我们的帮助能力)。