在AngularJS中使用$http的Promise时遇到问题。在我的服务中进行以下操作:(getSomething函数应链接两个Promise)
第二个函数使用外部回调函数!
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(); /* 回调函数 */ if(!err) { console.log(compacted); deferred.resolve(compacted); } else { console.log(err); deferred.reject(err); } /* 函数结束 */
return deferred.promise; }; });
当我在控制器中使用该服务时,它不会输出console.log:
blubb.getSomething(uri, input).then(function(data) { console.log(data) });
编辑: 如果我自己在'compactData'中定义回调函数,则可以正常工作,但是我正在使用https://raw.github.com/digitalbazaar/jsonld.js/master/js/jsonld.js 中的“jsonld.compact”,而这个方法不起作用!
jsonld.compact(input, context, function(err, compacted) { if(!err) { console.log(compacted); deferred.resolve(compacted); } else { deferred.reject('JSON-LD compaction'); } });
我在jsonld.compact中获得了console.log输出,但是resolve不起作用,我不知道为什么..
只有使用$rootScope.$apply(deferred.resolve(compacted))才能正常工作。
compacted
已经在某处定义并在作用域内,否则您可能需要将deferred.resolve(compacted);
更改为deferred.resolve("compacted");
,对于err
也是如此。 - Beetroot-Beetrootcompacted
和err
是由回调函数定义的!在此函数中,console.log(compacted)
也有正确的输出,但在“链接”的getSomething函数中却没有。 - Betty Stblubb.getSomething()
之前分别测试blubb.getData()
和blubb.compactData()
。 - Beetroot-Beetroot$rootScope.$apply
,它起作用了!(请参阅https://dev59.com/-23Xa4cB1Zd3GeqPha1B?rq=1) 但是我遇到了这个错误: “Error: $digest already in progress” - Betty Stif(!$scope.$$phase) { $scope.$apply(); }
- Renaud