मैं एक ऐसा ऐप लिख रहा हूं जो ऐप्पल से रिसेप्ट को सत्यापित करने के लिए बात करता है। उनके पास एक सैंडबॉक्स और उत्पादन यूआरएल है जिसे आप पोस्ट कर सकते हैं।नेस्टेड वादे के साथ स्वच्छ कोड लिखना
ऐप्पल के साथ संवाद करते समय, यदि आपको 21007 स्थिति मिलती है, तो इसका मतलब है कि आप उत्पादन यूआरएल पर पोस्ट कर रहे थे, जब आपको सैंडबॉक्स में पोस्ट करना चाहिए।
इसलिए मैंने पुनः प्रयास तर्क को सुविधाजनक बनाने के लिए कुछ कोड लिखा। यहाँ मेरी कोड का एक सरलीकृत संस्करण है:
var request = require('request')
, Q = require('q')
;
var postToService = function(data, url) {
var deferred = Q.defer();
var options = {
data: data,
url: url
};
request.post(options, function(err, response, body) {
if (err) {
deferred.reject(err);
} else if (hasErrors(response)) {
deferred.reject(response);
} else {
deferred.resolve(body);
}
});
return deferred.promise;
};
exports.verify = function(data) {
var deferred = Q.defer();
postToService(data, "https://production-url.com")
.then(function(body) {
deferred.resolve(body);
})
.fail(function(err) {
if (err.code === 21007) {
postToService(data, "https://sandbox-url.com")
.then(function(body){
deferred.resolve(body);
})
.fail(function(err) {
deferred.reject(err);
});
} else {
deferred.reject(err);
}
});
return deferred.promise;
};
की पुष्टि समारोह में पुन: प्रयास करें भाग बहुत बदसूरत और एकत्रित किए गए वादे के पढ़ने के लिए मुश्किल है। क्या ऐसा करने का कोई बेहतर तरीका है?
एक विचार यह है कि मन में आता है आइस्ड CoffeeScript जिसके लिए निरंतरता-गुजर (सी # के async के समान/इंतजार है) वाक्यात्मक समर्थन हासिल है उपयोग कर रहा है: http://maxtaco.github.io/coffee-script /। दुर्भाग्य से इसे कॉफीस्क्रिप्ट का उपयोग करने की आवश्यकता होगी, और इसके "गैर-मानक" संस्करण की आवश्यकता होगी जो कि बदमाश और इस तरह समर्थित नहीं है। – millimoose