我正在写一个应用程序与Apple进行验证以验证接收。他们有一个沙箱和生产网址,你可以发布。使用嵌套承诺编写干净的代码
与Apple通信时,如果您收到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这对于延续传递(类似于C#的异步/等待)语法支持:http://maxtaco.github.io/coffee-script /。不幸的是,这将需要使用CoffeeScript,以及不受grunt等支持的“非标准”变体。 – millimoose 2013-04-09 22:09:39