AngularJS 如何在 Typescript 中使用 $q

AngularJS how to use $q in Typescript

我是 AngularJs 的新手,也是 Typescript 的新手。 我在我的 AngularJs 项目中包含了 Typescript 但无法处理我 return a $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),如果我像上面那样实现此方法,则会出现编译器错误:'IQService' 类型的值不可调用。您是要包括 'new' 吗?

那我怎么用Typescript实现这个功能呢。 谢谢您的回答。

$q 不是功能而是服务。如果你想要延迟,你可以使用下面的代码例如:

var deferred = $q.defer();

$http(request).success(function (chartResponse) {
        deferred.resolve(monitor);
    }).error(function(response){
        deferred.reject(response);
    });

// return promise
return deferred.promise;

如果你不做任何其他事情,你可以记住什么,你可以 return $http 调用,因为它本身就是一个承诺:

return $http(request);

有几种方法可以 return 一个承诺... $http return每个 ajax 调用都是一个承诺,$timeout 也 return这是一个承诺。

话虽这么说,您想 return 通过 $q 基于预定事件($timeout$interval)以外的事情做出承诺,您可以这样做。 ..

// 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 有一些很好的辅助方法 return 一个 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');

因为您正在使用 $http(已经 returns 一个承诺)为什么不直接返回这个承诺?更简单,更快捷。

function foo(request, monitor, currentMonitorPropertys) {
  var currentChart;
  return $http(request).then(function (chartResponse) {
      //...
      return monitor;
  });
});

然后在使用此服务时,您可以从那里管理 successerror,这使得实现更简洁:

// for ex. in a controller

foo().then(mySuccessCallback)
     .catch(myErrorHandler)

你需要在解析它之前推迟 $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;
    });

})();

------------+ 希望对您有所帮助......