控制单个请求完成后再发出请求

78 阅读1分钟

可以使用递归函数和 promise 链来实现这个需求。我们可以定义一个函数,该函数接收包含所有请求参数的数组,并返回一个 Promise,只有在所有请求成功完成后,该 Promise 才会 resolve 并返回所有请求的结果数组。

function sendRequests(requests) {
  if (!requests || requests.length === 0) {
    return Promise.resolve([]);
  }

  const firstRequest = requests[0];
  const restRequests = requests.slice(1);

  return sendRequest(firstRequest)
    .then(result => {
      return sendRequests(restRequests).then(results => {
        results.unshift(result);
        return results;
      })
    });
}

在这个函数中,我们首先检查输入的数组是否为空。如果为空,则直接 resolve 一个空数组。否则,我们分离出第一个请求,并使用剩余的参数数组递归调用 sendRequests() 函数。每次请求完成后,我们都在后续请求的结果数组的开头插入该请求的结果。最终,整个函数将返回处理完成的所有请求的结果数组。

下面是 sendRequest() 函数的示例实现:

function sendRequest(param) {
  return new Promise((resolve, reject) => {
    fetch(`https://example.com/api/${param}`)
      .then(response => response.json())
      .then(data => resolve(data))
      .catch(error => reject(error))
  });
}

最后,我们可以使用 sendRequests() 函数来处理请求数组,并等待所有请求处理完成

sendRequests(["param1", "param2", "param3"])
  .then(results => console.log(results))
  .catch(error => console.error(error));

在以上示例中,我们将所有请求参数作为数组传递给 sendRequests() 函数,并在所有请求完成后输出结果数组。如果有任何一个请求失败,我们可以使用 catch() 函数来捕获错误并处理它们。