当数组中有2个项目时,为什么Typescript会报告长度为0

时间:2018-01-24 12:30:12

标签: arrays angular typescript

来自Firestore onSnapshot的响应是2条记录,我将其推入名为shop的数组中。

this.db.collection("Countries").doc("AU")
    .collection("cPostcode").doc(this.searchby)
    .collection(this.shop).where(how, '==', true)
    .onSnapshot(function (querySnapshot) {
        querySnapshot.forEach(function (doc) {
            shop.push(doc.data());
        })
    });
    console.log('shop.length', shop.length, 'Shop', shop);
    if (shop.length) {
        this.shopList = shop; .........

我使用shop.length > 0知道是否返回了任何数据,但即使数组中有2个项目,shop.length也等于0。

控制台日志的输出显示length:2 -

shop.length 0 shop []
    0:{ABN: "1", ACN: "2"}
    1:{ABN: "3", ACN: "4"}
    length:2
    __proto__:Array(0)

我已经尝试在forEach中放置一个标志,但是它超出了范围,所以我尝试了“this.count”变量。我一直在打算和关闭这几天。我用google搜索了这个问题和一般的打字稿帮助,但似乎没有其他人有这个问题。我究竟做错了什么?

1 个答案:

答案 0 :(得分:0)

可靠地获得长度,您需要确保等待结果。

  this.db.collection("Countries").doc("AU")
    .collection("cPostcode").doc(this.searchby)
    .collection(this.shop).where(how, '==', true)
    .onSnapshot((querySnapshot) => {
        // In here, we have data
        querySnapshot.forEach((doc) => {
            shop.push(doc.data());
        });

        console.log('shop.length', shop.length, 'Shop', shop);

        // Therefore, shop.length should work _reliably_
        if (shop.length) {
            alert(shop.length);
        }
  });

替代方法包括使用promises,或者在获得结果时调用函数(而不是仅仅查看该回调函数中的所有代码)。