Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/25.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/0/unity3d/4.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请求?_Javascript_Angularjs_Angular Promise - Fatal编程技术网

Javascript 如何在应用程序中同步HTTP请求?

Javascript 如何在应用程序中同步HTTP请求?,javascript,angularjs,angular-promise,Javascript,Angularjs,Angular Promise,我已经实现了一个cacheService,它具有方法get(url),该方法从HTTP获取值,将其放入localStorage并返回$q。在下一次运行.get(url)时,它从localStorage获取值,并返回用$q包装的值 function get(url){ var saved = JSON.parse(localStorage.getItem(url)); if (angular.isObject(saved)){ return $q.when(save

我已经实现了一个cacheService,它具有方法get(url),该方法从HTTP获取值,将其放入localStorage并返回$q。在下一次运行.get(url)时,它从localStorage获取值,并返回用$q包装的值

function get(url){
    var saved = JSON.parse(localStorage.getItem(url));
    if (angular.isObject(saved)){
        return $q.when(saved);
    }
    return $http.get(url).then(function(xhr){
        localStorage.setItem(url, JSON.stringify(xhr.data));
        return xhr.data;
    });
}
这里有一个例子,当我的方法不起作用时——它发出了不止一个HTTP请求

如果我调用cacheService.get(url)两次(例如,从不同的模块):

  • 当它第一次运行时,在localStorage中找不到缓存值并发出HTTP请求
  • 当它在第一次之后第二次运行时,第一个HTTP请求尚未完成,其结果值尚未缓存。所以我的方法第二次发出HTTP请求
我不喜欢它

因此,问题是:

如何按url同步请求,使每个url只有一个请求?

UPD: 我有个主意:

  • 定义
    var currentRequests={}
  • 如果localStorage具有缓存值,则返回该值
  • 如果
    currentRequests[url]
    为空,执行请求并设置
    currentRequests[url]=$http.get(url)
    -将承诺存储在
  • 如果
    currentRequests[url]
    不是空的,那么这个请求现在正在运行,那么只需
    返回currentRequests[url]
由于JS在浏览器中的单个线程中运行,currentRequests是线程安全的。但它不在nodejs中。对吗


你觉得怎么样?

这可能不是个好办法。但是你可以试一试

我建议你遵守一系列的承诺

var promiseArr = [];
function get(url){
    var saved = JSON.parse(localStorage.getItem(url));
    if (angular.isObject(saved)){
        return $q.when(saved);
    }
    //check if $http request for the url has a pending promise.
    if(!promiseArr.hasOwnProperty(url)){          
      promiseArr[url] = $http.get(url).then(function(xhr){
          localStorage.setItem(url, JSON.stringify(xhr.data));
          delete promiseArr[url]; //Delete the promise once resolved.. please check.
          return xhr.data;
      });
    }
    return promiseArr[url]; //return the promise from the array.   
}

我不确定这是否有帮助,但看看
$httpProvider.interceptors
你想同步所有请求还是只将请求同步到同一个url?@AmanGautam当然只是将请求同步到同一个url。每个url有一个。另外,请参见问题中的UPD。是的,它是线程安全的。。因为
服务
在整个应用程序中只实例化一次。是的,服务是单线程的,可以从不同的线程运行。据我所知,js在浏览器中的单个线程中运行。但是nodejs呢?
nodejs
?角度通常在前端。。您如何将其与
nodejs
code一起使用……我不知道,只是想:-)