10

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

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

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

  变种自我=这个;

  this.getSomething = 函数(uri,数据){
    返回 self.getData(uri).then(function(data2) {
      返回 self.compactData(uri, data2);
    });
  };

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

    返回 deferred.promise;
  };

  this.compactData = 函数(uri,数据){
    var deferred = $q.defer();
    /* 回调函数 */
      如果(!错误){
        console.log(压缩);
        deferred.resolve(压缩);
      } 别的 {
        控制台日志(错误);
        deferred.reject(err);
      }
    /* 函数结束 */

    返回 deferred.promise;
  };
});

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

blubb.getSomething(uri, input).then(function(data) {
  控制台日志(数据)
});

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

    jsonld.compact(输入,上下文,函数(错误,压缩){
      如果(!错误){
        console.log(压缩);
        deferred.resolve(压缩);
      } 别的 {
        deferred.reject('JSON-LD 压缩');
      }
    });

我在 jsonld.compact 中获得了 console.log 输出,但解析不起作用,我不知道为什么..

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

4

4 回答 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);
                });
于 2014-08-15T17:29:05.467 回答
1

Chaining promises works here : jsfiddle

In your implementation, if $http.get or compactData goes wrong your console.log(data) will not be call.

You should maybe catch errors :

    blubb.getSomething(uri, input).then(function(data) {
       console.log(data);    
    }, function(err) {
       console.log("err: " + err);
    });
于 2013-05-08T10:00:19.440 回答
1

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

var promisesApi = jsonld.promises();
var promise = promisesApi.compact(input, context);

// do something with the promise
于 2013-06-28T14:57:50.117 回答
0

我建议您使用工厂而不是服务。

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

于 2015-11-09T08:54:29.957 回答