当谈到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 回答
我正在使用这样的链接承诺:
链接承诺在这里工作:jsfiddle
在您的实现中,如果
$http.get
或compactData
出错,则不会调用console.log(data)
.您应该捕获错误:
每当你使用在新的转弯/勾选中运行的外部(AngularJS外部)回调时,你必须在调用后在适当的范围内调用$ apply() . 这让AngularJS知道它必须更新 . 在所有承诺都得到解决之后,您可能希望确保只调用一次 . 顺便说一句,jsonld.js提供了promises / future API,所以如果你已经使用了promises,那么就不必在上面做那个包装代码了 . 相反,你可以这样做:
我建议你使用Factory而不是服务 .
只需从工厂返回功能并在控制器中使用它