Я пишу приложение, которое общается с Apple для проверки квитанций. У них есть как песочница, так и рабочий URL-адрес, по которому вы можете публиковать сообщения.
При общении с Apple, если вы получаете статус 21007, это означает, что вы публиковали на производственный URL-адрес, когда вы должны публиковать в песочнице.
Поэтому я написал некоторый код, чтобы облегчить логику повторных попыток. Вот упрощенная версия моего кода:
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;
};
Часть повторных попыток в функции проверки довольно уродлива и трудна для чтения с вложенными промисами. Есть ли лучший способ сделать это?