Piszę aplikację, która rozmawia z Apple w celu weryfikacjiReceipts. Mają zarówno piaskownicę, jak i URL do produkcji, do którego możesz publikować.Pisanie czystego kodu z zagnieżdżonymi obietnicami
Podczas komunikacji z Apple, jeśli otrzymujesz status 21007, oznacza to, że publikujesz na produkcyjnym adresie URL, kiedy powinieneś publikować w piaskownicy.
Napisałem więc kod, aby ułatwić logikę ponowną. Oto uproszczona wersja mojego kodu:
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;
};
Część ponawiania w funkcji sprawdzenia jest dość brzydkie i trudne do odczytania z zagnieżdżonych obietnic. Czy jest lepszy sposób na zrobienie tego?
Jednym z pomysłów, które przychodzi do głowy jest użycie Iced coffeescript który posiada wsparcie dla składniowej kontynuacją przejściu (podobny do C# 's async/czekają): http://maxtaco.github.io/coffee-script /. Niestety wymagałoby to użycia CoffeeScript i jego "niestandardowego" wariantu, który nie jest obsługiwany przez pomruk i tym podobne. – millimoose