如何向promises链添加另一个并行AJAX调用

时间:2016-05-04 19:08:04

标签: javascript jquery ajax function promise

我正在编写一个

的应用程序
  1. 进行AJAX调用以基于IP建立用户位置 地址,然后
  2. 进行第二次AJAX调用以提供当前的天气数据 对于这个位置,那么
  3. 在DOM
  4. 中显示此数据

    我已经开发了以下承诺链,成功实现了上述目标:

    getUserLocation()
      .then(function(locationData) {
        return getCurrentWeather(locationData);
      }).then(function(currentWeatherData) {
        return showCurrentWeather(currentWeatherData);
      });
    

    现在我需要为应用添加更多功能,以便:

    1. 进行AJAX调用以基于IP建立用户位置 地址,然后
    2. 进行第二次AJAX调用以提供当前的天气数据 对于这个位置,和 进行第三次(并发,并行)AJAX调用,为该位置提供天气预报数据,然后
    3. 显示DOM中的当前天气数据,和 显示DOM中的天气预报数据
    4. 以下是我一直在尝试的内容,但它不起作用。你知道怎么解决这个问题吗?我的目标是找到一个只进行一次AJAX调用以获取用户位置的解决方案,然后在另外两个AJAX调用中使用这些数据(从getCurrentWeathergetWeatherForecast函数返回)。

      getUserLocation()
        .then(function(locationData) {
          getCurrentWeather(locationData);
          getWeatherForecast(locationData);
        }).then(function() {
          showCurrentWeather(currentWeatherData);
          showWeatherForecast(weatherForecastData);
        });
      

      更新1 - 找到工作解决方案:

      感谢@ReedSpool建议的方法,我设法开发了一个有效的代码:

      getUserLocation()
        .then(function(locationData) {
          return jQuery.when(
            getCurrentWeather(locationData),
            getWeatherForecast(locationData)
          );
        }).then(function(currentWeatherData, weatherForecastData) {
          showCurrentWeather(currentWeatherData[0]);
          showWeatherForecast(weatherForecastData[0]);
        });
      

      解决方案包括jQuery.when。我还必须将0的索引值添加到传递给showCurrentWeathershowWeatherForecast函数的参数中。这是因为返回的JSON现在包含有关readyStatestatus的其他信息。我的初始场景只有一次对天气API的AJAX调用,这种情况并没有发生。

1 个答案:

答案 0 :(得分:2)

如果你确实在使用jQuery promises(我从你问题的标签中收集,因为提供的代码没有jQuery特定的东西),那么你正在寻找jQuery.when()每个完整的promise库都有与此类似的功能(Q.all例如)

请注意,在第一个示例中,您返回getCurrentWeather(locationData)的结果。在promise回调中返回一个promise会使外部promise等待内部promise的解析。要等待两个或更多承诺解决,请使用jQuery.when()之类的...

getUserLocation()
  .then(function(locationData) {
    return jQuery.when(
      getCurrentWeather(locationData),
      getWeatherForecast(locationData)
    );
  }).then(function(curretnWeatherData, weatherForecastData) {
    showCurrentWeather(curretnWeatherData[0]);
    showWeatherForecast(weatherForecastData[0]);
  });

请参阅此处的文档:https://api.jquery.com/jquery.when/