从angularjs promise获取返回的id

时间:2017-02-10 22:27:24

标签: angularjs firebase angularfire

我正在尝试获取已保存记录的新ID,然后将该ID保存到另一个对象的数组中。但是,ID永远不会及时返回或未定义。我对角度和firebase非常新,并且到目前为止还有当前的代码。 服务:

 function addNewOffer(uid, offer) {

        var deferred = $q.defer();
        offers = $firebaseArray(firebaseDataService.offers);
        offers.$loaded().then(function (data) {
            offers = data;
            offers.$add(offer).then(function (ref) {
                var offerid = ref.key;
                console.log("added record with id " + offerid);
                deferred.resolve(offerid);
                return deferred.promise;
            }).catch(function (err) {
                console.log(err);
                deferred.reject(error);
            });

        })
    }

控制器:

 var offerid = offerService.addNewOffer(vm.userid, vm.offer);
        console.log(offerid);
        vm.transaction.offers.unshift(offerid);

        //then save transaction here

控制台说offerid未定义。所以,然后使交易不能保存。

2 个答案:

答案 0 :(得分:0)

你几乎拥有它。你需要抓住承诺。第一个函数是resolve函数,第二个函数是reject函数,你可以从addNewOffer()处理错误响应。

offerService.addNewOffer(vm.userid, vm.offer).then(function(offerid) {
  console.log(offerid);
  vm.transaction.offers.unshift(offerid);
}, function(err) {
  console.log(err);
})

您还应该在主函数中将return语句移到成功处理程序之外:

function addNewOffer(uid, offer) {

    var deferred = $q.defer();
    offers = $firebaseArray(firebaseDataService.offers);
    offers.$loaded().then(function (data) {
        offers = data;
        offers.$add(offer).then(function (ref) {
            var offerid = ref.key;
            console.log("added record with id " + offerid);
            deferred.resolve(offerid);
        }).catch(function (err) {
            console.log(err);
            deferred.reject(error);
        });

    });
    return deferred.promise;
}

否则,在解决firebase承诺之前,您将无法获得值。

答案 1 :(得分:0)

由于AngularFire API返回promises,因此无需使用$q.defer

制作承诺

通过在成功处理程序中使用return语句来链接Promise。通过使用throw语句链接拒绝。

function addNewOffer(uid, offer) {

    //var deferred = $q.defer();
    var offers = $firebaseArray(firebaseDataService.offers);
    promise = offers.$loaded()
      .then(function (data) {
        var offers = data;
        //return promise to chain
        return offers.$add(offer);
    }).then(function (ref) {
        var offerid = ref.key;
        console.log("added record with id " + offerid);
        //deferred.resolve(offerid);
        //return deferred.promise;
        //return promise to chain
    }).catch(function (err) {
        console.log(err);
        //deferred.reject(error);
        //throw to chain error
        throw err;
    });

    return promise;
}

<强>控制器

   var offeridPromise = offerService.addNewOffer(vm.userid, vm.offer);

   offeridPromise
     .then(function(offerid) {
        console.log(offerid);
        //vm.transaction.offers.unshift(offerid);
        //then save transaction here
        return offerid;
   }).catch(function(err) {
        console.log(err);
        throw err;
   });
  

链接承诺

     

因为调用promise的.then方法会返回一个新的派生promise,所以很容易创建一个promise链。可以创建任意长度的链,因为可以使用另一个承诺来解决承诺(这将进一步推迟其解析),可以在任何时候暂停/推迟承诺的解决。连锁,链条。这使得实现强大的API

成为可能      

-- AngularJS $q Srevice API Reference - Chaining Promises