【问题标题】:Firebase promise - Query.once failed: Was called with 1 argument. Expects at least 2Firebase 承诺 - Query.once 失败:使用 1 个参数调用。预计至少 2
【发布时间】:2016-06-02 06:14:13
【问题描述】:

我正在尝试使用 Promise 使用 Firebase 中的一些数据填充数组。这是数据库结构:

- domain name(or something)
  |--highscore
     |--Foo: 50
     |--Bar: 60

代码:

var arr=[];
highscoreRef.child('highscore').once('value').then(function(snapshot) {
    snapshot.forEach(function(data) {
    arr.push({playerName: data.key(), score: data.val()});
    });
  }, function(error) {
     console.error(error);
});

我收到Uncaught Error: Query.once failed: Was called with 1 argument. Expects at least 2.

这是否意味着我必须向 Foo 和 Bar 添加至少 2 个属性?前任。 Foo = {playerName: name, score: 50}

目前的数据库安排符合我的需要。

【问题讨论】:

  • 我很确定我已经毫无问题地使用了once() 承诺。给我一点时间来设置一个 jsfiddle/jsbin。
  • 为我工作:jsbin.com/qiranu/edit?js,console。您使用的是 Firebase JavaScript SDK 2.4 版或更高版本(即引入了 Promise)。
  • 我通常认为这是一个错字,这就是我发表评论的原因(一旦确认就投赞成票)。但是您可能是对的,鉴于错误消息,其他人可能会发现这一点。
  • @Frank van Puffelen,感谢您的快速回复!检查我使用的是哪个版本的想法从未闪过我的脑海。它是 2.2.1。我从其中一个教程中复制了 CDN,却忘记了在那里检查。我的错。无论如何,我可以将您的评论标记为答案?
  • @FrankvanPuffelen:是的,在这种情况下,它很有用。

标签: javascript firebase


【解决方案1】:

不要使用then。一次将回调函数作为第二个参数:

https://www.firebase.com/docs/web/api/query/once.html

var arr=[];
highscoreRef.child('highscore').once('value', function(snapshot) {
    snapshot.forEach(function(data) {
    arr.push({playerName: data.key(), score: data.val()});
    });
  }, function(error) {
     console.error(error);
});

【讨论】:

  • 我知道,但是this 文章说我可以在once() 之后使用then
  • @JeremyJackson 回调确实适用于任何 2.x 版本的 Firebase SDK。但是我们在 Firebase 的 JavaScript SDK 版本 2.4 中引入了一种使用 Promise 的替代语法。这就是 OP 试图使用的。
【解决方案2】:

当您尝试在预 Promisified SDK 上使用 Promisified API 时会出现此错误消息。

回调(其他答案建议)适用于任何 2.x 版本的 Firebase SDK。

我们在 Firebase 的 JavaScript SDK 版本 2.4 中引入了一种使用 Promise 的替代语法。在这个 jsbin 中查看 once().then() 的示例:http://jsbin.com/qiranu/edit?js,console

您使用的是 Firebase JavaScript SDK 2.4 版或更高版本(即引入了 Promise)?

【讨论】:

  • 原来我使用的是旧版 SDK (2.2.1)。从现在开始,我需要注意这些细节。再次感谢!
  • 您说“我们”,所以如果您的意思是字面意思(例如,您正在参与该项目),可能值得更新文档以显示 successCallback 现在是可选的。跨度>
  • 是的。该更新正在筹备中(我实际上以为它已经发布了,但显然还没有发布)。我们更改了大多数方法(例如 set() 在功能出现的同时,但不知何故忘记了 once()
猜你喜欢
  • 2016-09-05
  • 2021-03-14
  • 2019-07-27
  • 1970-01-01
  • 2022-01-07
  • 2011-12-25
  • 1970-01-01
相关资源
最近更新 更多