AngularJS:在服务中链接http承诺$ q
当涉及到angularjs中的$ http promises时,我遇到了问题。 我在我的服务中这样做:(getSomething函数应链接两个承诺)
第二个函数使用外部回调函数!
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'中定义回调函数,它可以工作,但我使用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 compacting'); } });
我在jsonld.compact获取console.log输出,但解决方案不起作用,我不知道为什么..
它只适用于$ rootScope。$ apply(deferred.resolve(compacted));
我正在使用像这样的链接承诺:
$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);
});
链接承诺适用于这里:jsfiddle
在你的实现中,如果$http.get
或compactData
出错,你的console.log(data)
将不会被调用。
你应该可能会发现错误:
blubb.getSomething(uri, input).then(function(data) {
console.log(data);
}, function(err) {
console.log("err: " + err);
});
每当你使用一个外部(外部的AngularJS)回调函数在新的回合/ tick中运行时,你必须在调用适当的作用域后调用$ apply()。 这让AngularJS知道它必须更新。 在完成所有承诺解决之后,您可能需要确保只调用一次。 另外,jsonld.js提供了promise / future API,所以如果你已经使用了promise,你不必在上面做这个包装器代码。 相反,你可以这样做:
var promisesApi = jsonld.promises();
var promise = promisesApi.compact(input, context);
// do something with the promise
链接地址: http://www.djcxy.com/p/77685.html