Ionic 类型'的参数(对齐:DataSnapshot)=>void“不能赋值给类型为"(a:数据快照)=>布尔值'

yvgpqqbh  于 2022-12-16  发布在  Ionic
关注(0)|答案(3)|浏览(141)

我已经阅读了关于这个问题的几个问题和答案,但无法解决它。
我正在使用Ionic2,并且我有一个从Firebase Database v3检索数据的方法。我不明白为什么我在执行ionic serve时会在控制台中得到以下错误:

Error TS2345: Argument of type '(snap: DataSnapshot) => void' is not assignable to parameter of type '(a: DataSnapshot) => boolean'.
  Type 'void' is not assignable to type 'boolean'.

方法如下:

constructor(private http: Http) {

    firebase.database().ref('users').orderByChild("id").on("value", function(snapshot){
                    let items = [];
                    snapshot.forEach(snap => {
                        items.push({
                            uid: snap.val().uid,
                            username: snap.val().username,
                        });
                    });
                });
            }
}
wecizke3

wecizke31#

DataSnapshot中的forEach方法具有以下签名:

forEach(action: (a: firebase.database.DataSnapshot) => boolean): boolean;

因为action可以返回true,使枚举短路,提前返回,如果返回的值为false,则枚举正常继续(文档中有提及)。
为了满足TypeScript编译器的要求,最简单的解决方案是返回false(以继续枚举子快照):

database()
    .ref("users")
    .orderByChild("id")
    .on("value", (snapshot) => {
        let items = [];
        snapshot.forEach((snap) => {
            items.push({
                uid: snap.val().uid,
                username: snap.val().username
            });
            return false;
        });
    });
d5vmydt9

d5vmydt92#

对于Typescript版本,我想出了这个解决方案:

db
  .ref(`jobs`)
  .orderByChild("counter")
  .on("value", (querySnapshot) => {
    const jobs: any[] = [];
    querySnapshot.forEach((jobRef) => {
      jobs.push(jobRef.val());
    });
    jobs.forEach(async (job) => {
      await minuteRT(job);
    });
    res.status(200).send("done!");
  });
zpgglvta

zpgglvta3#

在我的例子中,我必须return true来取消枚举:

// You can cancel the enumeration at any point by having your callback
// function return true. For example, the following code sample will only
// fire the callback function one time:

var query = firebase.database().ref("users").orderByKey();
query.once("value")
  .then(function(snapshot) {
    snapshot.forEach(function(childSnapshot) {
      var key = childSnapshot.key; // "ada"

      // Cancel enumeration
      return true;
  });
});

文件:[1][2]

相关问题