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

NodeJS回调未等待执行:如何等待GET请求响应后执行后续步骤

搞定异步GET请求的等待问题

嘿,看你的代码,你是想让getListOfChannels函数等GET请求拿到响应后,再执行下一步操作对吧?我给你两种实用的方案,按需选就行~

方案1:把回调用对(适合继续用现有request库的情况)

你已经在函数里加了callback参数,但目前的代码没在请求完成后调用它——这就是关键!我们要把请求的结果或者错误传递给回调,这样调用函数的时候,就能在回调里写后续逻辑了。

修复后的代码是这样的:

getListOfChannels: function(token, callback) {
  var Channels = [];
  var options = {
    method: 'GET',
    url: url, // 记得这里要确保url是已经定义好的变量哦
    headers: {
      'x-api-key': token
    }
  };

  request(options, function(error, response, body) {
    if (error) {
      // 别直接throw,把错误传给回调让调用者处理
      return callback(error);
    }
    try {
      var json = JSON.parse(body);
      var data = json.MemberEntitlement;
      for (var i = 0; i < data.length; i++) {
        // 这里补全你的判断条件,比如筛选Entitled为true的频道
        if (data[i].Entitled) {
          Channels.push(data[i]);
        }
      }
      // 请求处理完啦,把结果传给回调
      callback(null, Channels);
    } catch (parseError) {
      // 捕获JSON解析的错误,同样传给回调
      callback(parseError);
    }
  });
}

调用的时候这么写,后续操作就会等请求完成再执行:

getListOfChannels('你的token', function(error, channels) {
  if (error) {
    console.error('获取频道列表失败:', error);
    return;
  }
  // 这里就是请求完成后要做的事
  console.log('拿到的频道:', channels);
  // 比如渲染页面、存到数据库啥的
});

方案2:换成Promise+async/await(更推荐,代码更清爽)

旧的request库已经不维护啦,如果能换成现代HTTP库(比如axios)或者把request包装成Promise,用async/await写代码会像同步逻辑一样好读。

先给request套个Promise外壳:

getListOfChannels: function(token) {
  return new Promise((resolve, reject) => {
    var Channels = [];
    var options = {
      method: 'GET',
      url: url,
      headers: {
        'x-api-key': token
      }
    };

    request(options, function(error, response, body) {
      if (error) {
        return reject(error);
      }
      try {
        var json = JSON.parse(body);
        var data = json.MemberEntitlement;
        for (var i = 0; i < data.length; i++) {
          if (data[i].Entitled) {
            Channels.push(data[i]);
          }
        }
        resolve(Channels);
      } catch (parseError) {
        reject(parseError);
      }
    });
  });
}

然后用async/await调用,简直不要太直观:

async function handleChannels() {
  try {
    const channels = await getListOfChannels('你的token');
    // 这里就是请求完成后的下一步
    console.log('拿到的频道:', channels);
    // 后续操作随便写
  } catch (error) {
    console.error('出问题啦:', error);
  }
}

// 调用这个异步函数
handleChannels();

额外推荐:换成axios(更省心)

既然request已经废弃,不如直接用axios,它默认支持Promise,代码更简洁:

// 先装axios:npm install axios
const axios = require('axios');

getListOfChannels: async function(token) {
  try {
    const response = await axios.get(url, {
      headers: {
        'x-api-key': token
      }
    });
    // 用filter替代for循环,更简洁
    const Channels = response.data.MemberEntitlement.filter(item => item.Entitled);
    return Channels;
  } catch (error) {
    throw new Error(`获取频道失败:${error.message}`);
  }
}

调用方式和上面的async/await一样,逻辑清晰得很~


内容的提问来源于stack exchange,提问作者Kandarp Gandhi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:23:41