【问题标题】:Angularfire set does not return a $promiseAngularfire 设置不返回 $promise
【发布时间】:2015-03-22 21:56:51
【问题描述】:

当然,我刚开始使用 AngularFire 和 Firebase,但是,它看起来非常透明,并且有据可查。 然而,有一件事对我来说没有意义;

AngularFire 有一个 $set 函数,您可以使用它在后端存储中设置值。根据我的阅读,在 1.0.0 版本中,他们弃用了这个函数,现在它只是“设置”(没有 $ 符号)。 在我看来,不同之处在于 $set 用于返回一个 promise 对象,因此可以链接函数,而新的 set 函数似乎什么也不返回......

例如,当我有这个代码时:

function createprofile(authData, user){
  return fbutil.ref('profiles/'+authData.uid).set({ 
    firstname: user.firstname, 
    lastname: user.lastname 
  });
};

而我的 fbutil.ref 函数如下:

function firebaseRef(path) {
  var ref = new $window.Firebase(FB_BASEURL);
  var args = Array.prototype.slice.call(arguments);
  if( args.length ) {
    ref = ref.child(pathRef(args));
  }
  return ref;
}

如何处理“createprofile”的返回值?目前,它始终是“未定义的”。我希望我可以在“设置”函数之后进行链接,以确保它在做其他事情之前确实有效......

【问题讨论】:

    标签: angularjs firebase angularfire


    【解决方案1】:

    您还没有调用 AngularFire 集(正如您所指出的,在任何 AngularFire 服务中都有 no method by this name)。你调用了set() using the Firebase SDK,它不会返回一个promise,但希望你传入一个回调。复习fundamentals of writing data 会有所帮助。

    function createprofile(authData, user){
      var def = $q.defer();
      fbutil.ref('profiles/'+authData.uid).set({ 
        firstname: user.firstname, 
        lastname: user.lastname 
      }, function(err) {
        if( err ) { def.reject(err); }
        else { def.resolve(); }
      });
      return def.promise;
    };
    

    在内部,AngularFire 使用makeNodeResolver() utility 将回调转换为承诺。您可以将其用作上述方法的an example

    【讨论】:

    • 感谢您提供的链接,我会仔细查看它们以更好地了解它们在内部是如何工作的。而且,使用延迟确实有效,我想过这样做,但我想我会先问一下,因为可能有一些开箱即用的 angularfire。顺便说一句,我会接受你的回答,因为,显然它有效,但我认为你应该返回 promise 对象,而不是函数(所以,返回 def.promise 而不是 def.promise()),你可能想要将其编辑为您的答案。
    • 谢谢,蒂姆。我每周将 def.promise 和 def.promise() 混合十次。希望他们会同意。
    猜你喜欢
    • 1970-01-01
    • 2020-07-11
    • 2017-10-31
    • 2021-03-17
    • 2021-02-06
    • 2017-03-17
    • 1970-01-01
    • 2021-04-03
    • 2019-06-30
    相关资源
    最近更新 更多