从 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
我试图取回已保存记录的新 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