从 angularjs 承诺中获取返回的 ID

Get returned id from angularjs promise

我试图取回已保存记录的新 ID,然后将该 ID 保存到另一个对象的数组中。但是,ID 永远不会及时返回或未定义。我是 angular 和 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 未定义。所以,然后使交易不保存。

你几乎成功了。你需要抓住承诺。第一个函数是 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 promise 解决之前你将没有价值。

由于 AngularFire API returns 承诺,因此无需使用 $q.defer

制造承诺

通过在成功处理程序中使用 return 语句链接承诺。拒绝通过使用 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;
   });

Chaining promises

Because calling the .then method of a promise returns a new derived promise, it is easily possible to create a chain of promises. It is possible to create chains of any length and since a promise can be resolved with another promise (which will defer its resolution further), it is possible to pause/defer resolution of the promises at any point in the chain. This makes it possible to implement powerful APIs

-- AngularJS $q Srevice API Reference - Chaining Promises