当谈到 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));