Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何创建只发出一次http请求的angular js服务_Javascript_Angularjs - Fatal编程技术网

Javascript 如何创建只发出一次http请求的angular js服务

Javascript 如何创建只发出一次http请求的angular js服务,javascript,angularjs,Javascript,Angularjs,我有以下angularjs服务 var assetLookUpTransformService = function($http, $q) { this.data = null; var self = this; this.doStuff = function() { var defer = $q.defer(); if (self.data) { defer.resolve(self.data[0].DisplayName); } else {

我有以下angularjs服务

var assetLookUpTransformService = function($http, $q) {
this.data = null;
var self = this;

this.doStuff = function() {

    var defer = $q.defer();

    if (self.data) {
        defer.resolve(self.data[0].DisplayName);
    } else {
        $http({
            url: '../AssetLookup/GetAssetLookUp',
            method: "GET"
        }).success(function(response) {
            self.data = response;
            defer.resolve(self.data[0].DisplayName);
        });
    }
        return defer.promise;
    }
}
它可以正常工作,因为一旦$http请求返回了对“doStuff”的所有后续调用,就会从数据返回数据,而不是发出新的请求

然后我的问题是,在页面加载时,我会在对方之后打一大堆电话。现在发生的是,对doStuff的第一个调用将发出$http请求,但在第一个http请求返回之前对doStuff的任何调用也将发出$http请求

是否有一种方法可以调用doStuff“等待”未完成的$http请求返回,然后再调用doStuff


或者有没有办法确保$http请求只发生一次?

缓存承诺,而不是数据。数据被封装在promise中,并将始终返回给任何请求它的对象

var assetLookUpTransformService = function($http, $q) {
var self = this;

    this.doStuff = function() {
        if (!self.deferred) {
            self.deferred = $q.defer();

            $http({
                url: '../AssetLookup/GetAssetLookUp',
                method: "GET"
            }).success(function(response) {
                self.deferred.resolve(response[0].DisplayName);
            });
        }
        return self.deferred.promise;
    }
}

你为什么不在第一次打电话给多斯塔夫之后再打这些电话呢

例如:

this.doStuff = function(afterRequests) {
   var defer = $q.defer();

if (self.data) {
    defer.resolve(self.data[0].DisplayName);
} else {
    $http({
        url: '../AssetLookup/GetAssetLookUp',
        method: "GET"
    }).success(function(response) {
        self.data = response;
        defer.resolve(self.data[0].DisplayName);
        //make each request in here.
        afterRequests.forEach(function(request) {
           $http(request).success(function(response) { 
           //use self.data here
           });
        });
    });
}
    return defer.promise;
}
如果出于某种原因,您必须同时制作doStuff(例如,它运行时间很长),那么您可以使用$rootScope.$broadcast以可能需要渲染数据的控制器为目标