我是AngularJs的新手,也是Typescript的新手。 我在我的AngularJs项目中包含了Typescript但是无法处理我返回$ q的服务(function(){...})
我的代码如下:
function foo(request, monitor, currentMonitorPropertys) {
var currentChart;
return $q(function (resolve) {
$http(request).success(function (chartResponse) {
...
resolve(monitor);
}).error(function(response){
...
});
});
我使用VS2013(TypeScript),如果我像上面那样实现这个方法,会出现一个compilererror:类型' IQService'不可赎回。你的意思是包括' new'?
那我怎么能用Typescript实现这个功能呢? 谢谢您的回答。
答案 0 :(得分:1)
有几种方法可以返回一个promise ... $http
返回一个带有每个ajax调用的promise,$timeout
也会返回一个promise。
据说你希望通过$timeout
基于预定事件($interval
,$q
)以外的其他方式返回承诺,你可以这样做......
// assume $q is injected into your service/controller/factory
// create a defer object
var defer = $q.defer();
// do something...
if (doSomething()){
defer.resolve(); //something went right
else {
defer.reject(); //something went wrong
}
//make sure you return out the promise, so the consumer can act upon it.
return defer.promise;
此外,$q
有一些很好的帮助器方法来返回一个你可以在存在一些逻辑时使用的promise;
// this will a promise that will resolve with the value provided
return $q.when({some: 'result'});
// this will return a promise that will reject with the error specified
return $q.reject('some error message');
答案 1 :(得分:0)
$q
不是一项功能,而是一项服务。如果您想要延迟,可以使用以下代码:
var deferred = $q.defer();
$http(request).success(function (chartResponse) {
deferred.resolve(monitor);
}).error(function(response){
deferred.reject(response);
});
// return promise
return deferred.promise;
如果你不做任何其他事情,你可以记住什么,你可以回复$http
电话,因为它本身就是一个承诺:
return $http(request);
答案 2 :(得分:0)
当您使用$http
(已经返回承诺)时,为什么不直接返回此承诺?更简单,更快捷。
function foo(request, monitor, currentMonitorPropertys) {
var currentChart;
return $http(request).then(function (chartResponse) {
//...
return monitor;
});
});
然后,在使用此服务时,您可以从那里管理success
和error
,这样可以实现更整洁的实施:
// for ex. in a controller
foo().then(mySuccessCallback)
.catch(myErrorHandler)
答案 3 :(得分:0)
你需要在解决之前推迟$ q这是代码试试这个
(function retriveDemoJsonData(){
angular.module('myApp').factory('actionData', function ($q, $http) {
var data={};
data.actionDataJson = function(id){
//The original business logic will apply based on URL Param ID
var defObj = $q.defer(); $http.get('demodata.json') .then(function(res){ defObj.resolve(res.data[0]); }); return defObj.promise;
}
return data;
});
})();
---------- + 我希望这能帮到你......