我正在尝试打包我的post / get / put / delete调用,以便在调用它们的任何时候,如果它们失败,它们将检查过期的令牌,如果这是失败的原因再试一次,否则只需解决响应/错误。试图避免重复代码四次,但我不确定如何从非匿名回调中解决。
factory.post = function (url, data, config) {
var deferred = $q.defer();
$http.post(url, data, config).then(factory.success, factory.fail);
return deferred.promise;
}
factory.success = function (rsp) {
if (rsp) {
//how to resolve parent's promise from from here
}
}
替代方案是复制4次:
.then(function (rsp) {
factory.success(rsp, deferred);
}, function (err) {
factory.fail(err, deferred);
});
答案 0 :(得分:0)
一种解决方案可能是使用bind功能。
function sum(a){
return a + this.b;
}
function callFn(cb){
return cb(1);
}
function wrapper(b){
var extra = {b: b};
return callFn(sum.bind(extra));
}
console.log(wrapper(5));
console.log(wrapper(-5));
console.log(wrapper(50));

对于您的解决方案,请查看以下示例
factory.post = function (url, data, config) {
var deferred = $q.defer();
$http.post(url, data, config).then(factory.success.bind({deferred: deferred}), factory.fail.bind({deferred: deferred}));
return deferred.promise;
}
factory.success = function (rsp) {
if (rsp) {
this.deferred.resolve(rsp);
//how to resolve parent's promise from from here
}else {
//retry or reject here
}
}
答案 1 :(得分:0)
据我所知,您只想在成功时解析延迟对象,并在过期令牌时重试错误。您也可能希望保留重试次数。如果是的话,
编辑 - 似乎我误解了这个问题。 Atiq建议的答案应该有效,或者如果你使用任何功能JS库如下划线或Ramdajs,你可以使用curry函数。使用curry函数,您可以将一些参数传递给函数,只有在传递完所有参数后才能执行该函数。我修改了代码片段以使用下划线的curry函数。
factory.post = function (url, data, config) {
var deferred = $q.defer();
$http.post(url, data,
config).then(_.curry(factory.success(deferred)),
_.curry(factory.fail(deferred));
return deferred.promise;
}
factory.success = function (deferred, rsp) {
if (rsp) {
//handle resp
deferred.resolve(rsp);
}
}
factory.fail = function(deferred, err){
//handle retry
deferred.reject(err);
}