मेरे पास डेटा है जिसे मैं "पुन: सत्यापित" करना चाहता हूं। तो मुझे एक अनुरोध करने की ज़रूरत है, कॉलबैक से डेटा को बचाएं, वर्तमान डेटा को हटा दें, फिर कॉलबैक से डेटा के साथ एक पोस्ट करें।
मुझे किसी तरह $ q का उपयोग करने की आवश्यकता है।
शायद मैं पूरी तरह से बंद हूँ, लेकिन यहाँ मैं क्या करने की कोशिश की है।
$scope.reSaveBIM = function(){
var defer = $q.defer();
defer.promise
.then(function(){
$http.get("/api/bim/" + $scope.activePartOfBim._id)
.success(function(fullBIM){
console.log(fullBIM); //Defined
return fullBIM;
}
);
})
.then(function(fullBIM){
console.log(fullBIM); //Undefined
$http.delete("/api/bim/" + $scope.activePartOfBim._id);
return fullBIM
})
.then(function(fullBIM){
$http.post("/api/bim", {bim:JSON.stringify(fullBIM)});
});
defer.resolve()
};
पहले कॉलबैक से डेटा जंजीर में नहीं लौटा है। क्या मैं सही रास्ते पर हूं? मैंने $ q.all का उपयोग करने का भी प्रयास किया लेकिन असफल रहा।
कोई विचार?
उत्तर:
उत्तर № 1 के लिए 1अतिरिक्त बनाने की कोई आवश्यकता नहीं है $q.defer
ऑब्जेक्ट, आप बस द्वारा दिए गए वादे को चेन कर सकते हैं $http
...
$scope.reSaveBIM = function() {
return $http.get("/api/bim/" + $scope.activePartOfBim._id).then(function(response) {
var fullBIM = response.data;
return fullBIM;
}).then(function(fullBIM) {
return $http.delete("/api/bim/" + $scope.activePartOfBim._id).then(function() {
return fullBIM;
});
}).then(function(fullBIM) {
return $http.post("/api/bim", { bim:JSON.stringify(fullBIM) }).then(function() {
return fullBIM;
});
}).catch(function(response) {
// return an error message using throw
throw "Something went wrong - Status " + response.status;
});
};
इसे कॉल करने के लिए ...
$scope.reSaveBIM().then(function(fullBIM) {
console.log("success! fullBIM: ", fullBIM);
}, function(errorMsg) {
console.log(errorMsg);
});
जवाब के लिए 0 № 2
आप लगभग सही हैं, और आपको इसकी आवश्यकता नहीं है defer
। के बजाय success
उपयोग then
। मुझे लगता है कि सफलता वादा वापस नहीं करती है। इसके अलावा $ http then
सफलता कॉलबैक है data
में response.data
गुण.
जवाब के लिए 0 № 3
AngularJS की $ http पहले से ही $ q सेवा को लपेटता है। दस्तावेज से:
$ Http एपीआई $ q सेवा द्वारा उजागर किए गए स्थगित / वादे एपीआई पर आधारित है।
मूलतः आपकी समस्या यह है कि $ http एक का उपयोग करता है$ q के साथ आप जो निर्माण कर रहे हैं, उससे अलग वादा। आपको वही काम करने के लिए अपने $ http कॉल की श्रृंखला की आवश्यकता है। तथ्य यह है, आप पहले से ही $ q से वादों का उपयोग कर रहे हैं।
इसके अलावा, आप कार्यों को घोषित करके और उन्हें चर के रूप में पारित करके इसे समतल कर सकते हैं।
$http.get("/api/bim/" + $scope.activePartOfBim._id)
.success(firstSuccessFunction);
var firstResponse;
var firstSuccessFunction = function(fullBIM){
console.log(fullBIM); //Defined
firstResponse= fullBIM;
$http.delete("/api/bim/" + $scope.activePartOfBim._id)
.success(secondSuccessFunction);
};
var secondSuccessFunction = function(deleteResponse) {
$http.post("/api/bim", {bim:JSON.stringify(firstResponse)});
};