首页 文章

AngularJS:在服务中链接http承诺$ q

提问于
浏览
8

当谈到angularjs中的$ http承诺时,我遇到了问题 . 我在我的服务中这样做:( getSomething函数应链接两个promises)

第二个函数使用外部回调函数!

app.service('blubb', function($http, $q) {

  var self = this;

  this.getSomething = function(uri, data) {
    return self.getData(uri).then(function(data2) {
      return self.compactData(uri, data2);
    });
  };

  this.getData = function(uri) {
    var deferred = $q.defer();
    $http.get(uri).success(function(data) {
      deferred.resolve(data);
    }).error(function() {
      deferred.reject();
    });

    return deferred.promise;
  };

  this.compactData = function(uri, data) {
    var deferred = $q.defer();
    /* callback function */
      if(!err) {
        console.log(compacted);
        deferred.resolve(compacted);
      } else {
        console.log(err);
        deferred.reject(err);
      }
    /* end of function */

    return deferred.promise;
  };
});

当我在我的控制器中使用该服务时,它不会输出console.log:

blubb.getSomething(uri, input).then(function(data) {
  console.log(data)
});

编辑:如果我在'compactData'中自己定义回调函数,它可以工作,但我使用"jsonld.compact"来自https://raw.github.com/digitalbazaar/jsonld.js/master/js/jsonld.js,这不起作用!

jsonld.compact(input, context, function(err, compacted) {
      if(!err) {
        console.log(compacted);
        deferred.resolve(compacted);
      } else {
        deferred.reject('JSON-LD compacting');
      }
    });

我在jsonld.compact中获取console.log输出,但解决方案不起作用,我不知道为什么..

它只适用于$ rootScope . $ apply(deferred.resolve(compacted));

4 回答

  • 5

    我正在使用这样的链接承诺:

    $http.get('urlToGo')
                    .then(function(result1) {
                        console.log(result1.data);
                        return $http.get('urlToGo');
                    }).then(function(result2) {
                        console.log(result2.data);
                        return $http.get('urlToGo');
                    }).then(function(result3) {
                        console.log(result3.data);
                    });
    
  • 1

    链接承诺在这里工作:jsfiddle

    在您的实现中,如果 $http.getcompactData 出错,则不会调用 console.log(data) .

    您应该捕获错误:

    blubb.getSomething(uri, input).then(function(data) {
           console.log(data);    
        }, function(err) {
           console.log("err: " + err);
        });
    
  • 1

    每当你使用在新的转弯/勾选中运行的外部(AngularJS外部)回调时,你必须在调用后在适当的范围内调用$ apply() . 这让AngularJS知道它必须更新 . 在所有承诺都得到解决之后,您可能希望确保只调用一次 . 顺便说一句,jsonld.js提供了promises / future API,所以如果你已经使用了promises,那么就不必在上面做那个包装代码了 . 相反,你可以这样做:

    var promisesApi = jsonld.promises();
    var promise = promisesApi.compact(input, context);
    
    // do something with the promise
    
  • 0

    我建议你使用Factory而不是服务 .

    只需从工厂返回功能并在控制器中使用它

相关问题