【问题标题】:Firebase returns snapshot but can't access valueFirebase 返回快照但无法访问值
【发布时间】:2016-04-01 17:02:24
【问题描述】:

Peep 总是从函数返回未定义。有人可以指出我的问题吗?在成功函数中,快照按预期返回。我认为这是一个范围界定问题。

function getPerson( id ) {

    var ref = new Firebase( "https://foo.firebaseio.com/people/" + id ),
    peep;

    // Attach an asynchronous callback to read the data at our people reference
    ref.once( "value", function( snapshot ) {
        //success
        peep = snapshot;

    }, function ( errorObject ) {
        //error
        //console.log( "The read failed: " + errorObject.code );
    });

    return peep;

}

【问题讨论】:

标签: javascript firebase firebase-realtime-database


【解决方案1】:

once() 方法是异步的,这就是使用回调的原因。您可以将回调作为参数传递给 id 旁边的 getPerson function

function getPerson(id, callback) {
  var ref = new Firebase( "https://foo.firebaseio.com/people/" + id );

  ref.once( "value", function(snapshot) {
    var peep = snapshot;
      // error will be null, and peep will contain the snapshot
      callback(null, peep);
    }, function (error) {
      // error wil be an Object
      callback(error)
  });
}

getperson('9234342', function (err, result) {
  console.log(result);
});

【讨论】:

    【解决方案2】:

    是的,应该是因为成功回调没有立即触发。它接收数据然后进入它。

    尝试在回调中返回peep,例如。

    return ref.once( "value", function( snapshot ) {
            //success
            peep = snapshot;
            return peep;
    
        }, function ( errorObject ) {
            //error
            //console.log( "The read failed: " + errorObject.code );
        });
    

    希望对你有帮助。

    【讨论】:

      【解决方案3】:

      once() 方法是异步的,这就是使用回调的原因。您在 peep 甚至没有值之前就返回了它。 peep在回调中定义后需要返回。

      function getPerson( id ) {
      
          var ref = new Firebase( "https://foo.firebaseio.com/people/" + id ),
          peep;
      
          // Attach an asynchronous callback to read the data at our people reference
          return ref.once( "value", function( snapshot ) {
              //success
              peep = snapshot;
              return peep;
          }, function ( errorObject ) {
              //error
              //console.log( "The read failed: " + errorObject.code );
          });
      }
      

      然后像这样使用它:

      getPerson('9234342').then(function(snapshot) {
        console.log(snapshot.val());
      }).catch(function(error) {
        console.error(error);
      });
      

      【讨论】:

      • return peep 仍然无法正常工作。见stackoverflow.com/questions/14220321/…
      • 对不起,但这仍然行不通。 return peep 返回一个值,但没有人在等待该值。如果你愿意,你可以回报承诺。只需return ref.once("value")
      • 我在您的答案中添加了一个用法部分,请参阅this working jsbin。请注意,这需要 Firebase JavaScript SDK 2.4 或更高版本,因为它依赖于 Promise。
      猜你喜欢
      • 2021-07-03
      • 2017-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-04
      • 1970-01-01
      相关资源
      最近更新 更多