首页 > 解决方案 > 如何同步获取响应和异步请求?

问题描述

var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
outArr = [];

var fetchData = async (str) => {

    var b = await fetch('http://api.mathjs.org/v4/?expr=' + str);
    var c = await b.json();

    console.log(c)

}

function abc(arr) {

    len = arr.length;

    for (let i = 0; i < len; i++) {
        var str = i + '*' + i;
        fetchData(str);

    }

}


console.log(abc(arr));

你能告诉我如何同步获取http请求的响应并异步点击请求吗?

预期产出

[1、4、9、16、25、36、49、64、81、100]

我尝试了async等待但仍然得到异步响应。

我们可以使用promises吗?如何synchronously使用 promises 获得响应。

在此处输入图像描述

我收到了这个回复

标签: javascript

解决方案


您不能使任何异步同步-相反,最好的方法是进行abc async每次await迭代。(如果您不想一次发出所有请求 - 如果您可以一次发出所有请求,请Promise.all改用)

您还应该注意不要在使用outArrand时隐式创建全局变量len

以下是您将如何做到的await

const fetchData = async (str) => {
  const b = await fetch('https://api.mathjs.org/v4/?expr=' + str);
  return b.json();
}
async function abc() {
  const output = [];
  for (const i of Array.from({ length: 10 }, (_, i) => i + 1)) {
    const str = i + '*' + i;
    const result = await fetchData(str);
    output.push(result);
  }
  return output;
}
abc()
  .then(output => {
    console.log(output);
  });

(mathjs 存在证书问题,因此您可能需要在浏览器中添加异常才能使代码段正常工作)


推荐阅读