Angular 1.x,如何从回调中解析父母的承诺

时间:2018-03-11 04:33:19

标签: javascript angularjs http

我正在尝试打包我的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);
        });

2 个答案:

答案 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);
    }