同步发送http请求

时间:2016-09-19 06:56:02

标签: angularjs http asynchronous

我有一个场景,其中一个请求的响应将在响应头中包含一个令牌,我需要将此令牌与随后的任何其他后续请求相关联。 有什么建议吗?

不能使用promise,因为请求的顺序没有定义,可以是任意随机顺序。

以下是我的$ http邮政编码:

    var appURL = ''; 
   appURL = serverURL + $backendApis[apiName] + "/?_s=" + $http.defaults.headers.common['Session-Alias'];

         return $http.post(appURL, postParams).success(function(response, status, headers, config) {

            $http.defaults.headers.common['Custom-Access-Token'] = headers('Custom-Access-Token'); 
            if (response.errorCode && response.errorCode != "8233" && response.errorCode != "506717") {
                alert("Sorry, we are not able to provide you a quotation at this stage as we are facing a technical issue. Please get back after sometime to issue a quotation or call us. Sorry for the inconvenience");
            }
        });

我只需要等待我的下一个请求开始,直到我没有得到第一个请求。 尝试过使用ajax并将async设置为false,但不好的是它会冻结整个U.I的chrome,给用户带来不好的体验。

1 个答案:

答案 0 :(得分:0)

这通常是一个糟糕的想法:通过" design"来同步它的异步。它的某些东西会让你的代码闻起来(如果其中一个端点是不可缓存的,它会挂起你的应用程序)。

但是如果出于某种原因你需要这样做,你仍然需要使用promises,但采用递归方法:

var promises = urls(); //all your urls in an array

function doCall(){

   var appUrl = promises.pop();
   $http.post(appURL, postParams).success(function(response, status, headers, config) {

        $http.defaults.headers.common['Custom-Access-Token'] = headers('Custom-Access-Token');
        if (response.errorCode && response.errorCode != "8233" && response.errorCode != "506717") {
            alert("Sorry, we are not able to provide you a quotation at this stage as we are facing a technical issue. Please get back after sometime to issue a quotation or call us. Sorry for the inconvenience");
        }
    }).then(function(){
        if(!promises.length) //no urls left, kill the process.
          return;

        doCalls(); //go ahead for the next one
    });
}
通过这种方式,您可以同步$ http请求。