You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在嵌套AJAX调用中传递变量?WordPress API异步问题

解决方案

问题根源

你的getServerName函数里的AJAX是异步操作,直接调用它时,函数不会等待AJAX请求完成就返回了,所以你拿到的是undefined。必须等待异步请求完成后,再把服务器名称插入到DOM中。

jQuery 修复版本

修改getServerName让它返回AJAX请求的Promise,然后在渲染DOM前等待这个请求完成:

function getPosts(object, query) {
  jQuery.ajax({ 
    type: 'GET', 
    url: query,  
  })
  .then(function (data) {
      jQuery.each(data, function(i, post) {
        let siteTitle = post['title']['rendered'];
        let siteServer = '12'; // 实际应从post中获取对应ID
        
        // 等待服务器名称请求完成后再渲染DOM
        getServerName(siteServer).then(function(serverName) {
          jQuery(object).append(`
            <div class="get-post-item">
              <div class="site-title"><span>${siteTitle}</span></div>
              <div class="site-server"><span>${serverName}</span></div>
            </div>
          `);
        });
      });
    }
  )
}

// 修改后返回AJAX的Promise对象,让外部可以等待请求完成
function getServerName(id) {
  return jQuery.ajax({
    type: 'GET', 
    url: '/wp-json/wp/v2/servers/' + id
  })
  .then(function (data) {
    return data['title']['rendered'];
  });
}

如果想避免并行请求导致的DOM顺序混乱,可以改用async/await简化异步逻辑:

function getPosts(object, query) {
  jQuery.ajax({ 
    type: 'GET', 
    url: query,  
  })
  .then(async function (data) {
      // 改用for...of循环配合await,保证渲染顺序和文章顺序一致
      for (let post of data) {
        let siteTitle = post['title']['rendered'];
        let siteServer = '12';
        // 等待服务器名称请求完成
        let serverName = await getServerName(siteServer);
        jQuery(object).append(`
          <div class="get-post-item">
            <div class="site-title"><span>${siteTitle}</span></div>
            <div class="site-server"><span>${serverName}</span></div>
          </div>
        `);
      }
    }
  )
}

function getServerName(id) {
  return jQuery.ajax({
    type: 'GET', 
    url: '/wp-json/wp/v2/servers/' + id
  })
  .then(function (data) {
    return data['title']['rendered'];
  });
}

原生JavaScript 解决方案(使用Fetch API)

现代浏览器推荐用原生Fetch API,语法更简洁且原生支持Promise:

async function getPosts(object, query) {
  try {
    const response = await fetch(query);
    const data = await response.json();
    
    for (const post of data) {
      const siteTitle = post.title.rendered;
      const siteServer = '12'; // 实际从post获取对应ID
      
      // 获取服务器名称
      const serverResponse = await fetch(`/wp-json/wp/v2/servers/${siteServer}`);
      const serverData = await serverResponse.json();
      const serverName = serverData.title.rendered;
      
      // 创建DOM元素并插入页面
      const postItem = document.createElement('div');
      postItem.className = 'get-post-item';
      postItem.innerHTML = `
        <div class="site-title"><span>${siteTitle}</span></div>
        <div class="site-server"><span>${serverName}</span></div>
      `;
      document.querySelector(object).appendChild(postItem);
    }
  } catch (error) {
    console.error('请求出错:', error);
  }
}

优化建议

  • 如果需要获取多个服务器ID,建议查看WordPress REST API是否支持批量获取服务器数据,减少HTTP请求数量提升性能。
  • 可以先渲染文章标题占位,等服务器名称加载完成后再更新对应DOM节点,避免页面长时间空白。

内容的提问来源于stack exchange,提问作者2Mz4Real

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 16:45:31