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

如何仅使用Promises实现数组元素的串行Fetch请求?

逐个执行Promise请求的实现方案

完全可以只用原生Promise实现串行请求,不用递归也能写出更简洁易维护的代码,下面提供两种常用方案:

方案一:利用Array.prototype.reduce串联Promise

这是实现串行Promise链的经典方式,借助reduce的累积特性,将每个请求依次衔接:

const words = "words to fetch from this array".split(' ');

// 模拟fetch请求逻辑
function fetchWord(word) {
  return new Promise((resolve) => {
    console.log(`模拟fetch调用: ${word}`);
    setTimeout(() => {
      resolve(`已完成: ${word}`);
    }, 1000);
  });
}

// 串行执行所有请求
words.reduce((prevPromise, currentWord) => {
  return prevPromise.then(() => fetchWord(currentWord));
}, Promise.resolve()); // 初始传入已resolved的Promise,启动整个调用链

原理:reduce的累积值始终是前一个请求的Promise,每次迭代都会等待前一个Promise完成后,再执行当前的fetch请求,自然形成串行执行的逻辑。

方案二:使用async/await(基于Promise的语法糖)

如果运行环境支持ES2017+,用async/await可以写出更直观的串行代码,本质依然是Promise:

const words = "words to fetch from this array".split(' ');

function fetchWord(word) {
  return new Promise((resolve) => {
    console.log(`模拟fetch调用: ${word}`);
    setTimeout(() => {
      resolve(`已完成: ${word}`);
    }, 1000);
  });
}

async function serialFetch() {
  for (const word of words) {
    await fetchWord(word);
  }
}

serialFetch();

原理:await会暂停函数执行,直到当前fetch请求的Promise状态变为resolved,之后才会进入下一次循环,实现逐个执行的效果。

对比递归实现

你的递归方案是可行的,但上述两种写法无需手动管理递归调用的终止条件,代码结构更清晰,可读性和可维护性更强,也更符合现代JavaScript的编码习惯。

内容的提问来源于stack exchange,提问作者Jolly Boy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 22:22:55