【问题标题】:Handle multiple response in javascript在javascript中处理多个响应
【发布时间】:2015-02-04 05:40:25
【问题描述】:

您好,我正在使用 angluarjs 并行访问 5 个 Web 服务。 现在,当响应到达时,我无法识别它所属的服务。

我怎么知道哪个响应是哪个?

演示代码为:

var requestUrl=[url1,url2,url3,url4,url5];
for(var i=0;i<requestUrl.length;i++){
      $http.get(requestUrl[i]).success(response){
          console.log(response);
      };
 }

【问题讨论】:

  • 这完全取决于调用代码。有许多技术,但我们需要查看调用 5 个 Web 服务的代码以提出有意义的建议,而不是展开涵盖数百种可能实现方式的通用讨论。仅供参考,最常见的答案是您使用闭包,因此您可以在获得完成回调时访问它是哪个请求。如何最好地做到这一点完全取决于您的代码的结构。
  • jfriendnd00 请检查更新后的问题

标签: javascript json angularjs http


【解决方案1】:

这里的问题是您不知道响应哪个请求,因为您没有隔离上下文。 让我们解释一下:

var requestUrl=[url1,url2,url3,url4,url5];
for(var i=0;i<requestUrl.length;i++){
    // Here you're making an async call to a URL
    $http.get(requestUrl[i]).success(response){
        // When the response arive, i=4, it appends after the loop is over
        console.log(response);
    };
}

为避免这种情况,有 2 个良好做法:

-> 将循环更改为“forEach”

var requestUrl=[url1,url2,url3,url4,url5];
requestUrl.forEach(function(url) {
    $http.get(url).success(response){
        console.log(url '+' response);
    };
}

-> 保留一个 for 循环,但使用闭包来保留索引或 URL

var requestUrl=[url1,url2,url3,url4,url5];
for(var i=0;i<requestUrl.length;i++){
     // Here you can keep "i" in "index"
    (function(index) {
        $http.get(requestUrl[i]).success(response){
            console.log(requestUrl[index] + response);
        };
    })(i);
}

【讨论】:

    【解决方案2】:

    如果你这样做:

    $http.get('/someUrl').
      success(function(data, status, headers, config) {
        // this callback will be called asynchronously
        // when the response is available
      }).
      error(function(data, status, headers, config) {
        // called asynchronously if an error occurs
        // or server returns response with an error status.
      });
    

    您可以从headers 获取Host HTTP 标头并据此进行比较。

    【讨论】:

    • 我试过了,但是所有的服务都托管在同一台服务器上。所以每次响应都会得到相同的标题。
    • @Ashish_B 然后在GET请求中添加一些返回值来识别每一个。
    • @Ashish_B 或者让你的 AJAX 调用同步。
    • 谢谢..但是得到了答案,您可以将 $http 请求方法保留在另一个函数中并将 url 作为参数传递,然后将根据它们映射到的 url 来识别响应
    【解决方案3】:

    您可以通过多种方式来处理您的特定问题,但它不太可能在更高级别上完成您可能尝试做的事情。那就是……

    您有一组要获取的 URL。您也可以将您的响应存储在一个数组中,然后您就会知道哪个是哪个:

    var requestUrl = [url1,url2,url3,url4,url5];
    var responses = [];
    
    for (var i = 0; i < requestUrl.length; i++){
        responses[i] = null;
    
        $http.get(requestUrl[i]).success(function (response) {
            responses[i] = response;
        });
    }
    

    当然,您必须找到一种方法与最后的 .success() 通话联系起来,以完成您的 console.log()(或您接下来要做的任何事情)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-03-08
      • 1970-01-01
      • 2019-08-05
      • 1970-01-01
      • 1970-01-01
      • 2021-03-24
      • 2018-12-27
      相关资源
      最近更新 更多