我正在编写一个与 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;
};
验证函数中的重试部分非常难看,嵌套的 Promise 很难阅读。有没有更好的方法来做到这一点?