我正在尝试获取已保存记录的新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未定义。所以,然后使交易不能保存。
答案 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