Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/459.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在元素数组上同步调用异步函数?_Javascript_Asynchronous_Async Await - Fatal编程技术网

Javascript 如何在元素数组上同步调用异步函数?

Javascript 如何在元素数组上同步调用异步函数?,javascript,asynchronous,async-await,Javascript,Asynchronous,Async Await,如何在元素数组上同步调用异步函数,以便只在对当前元素的异步调用完成后调用下一个异步函数 例如,如果我们看下面的代码 const fetch = require("cross-fetch"); function wait(a) { fetch(`https://jsonplaceholder.typicode.com/todos/${a}`) .then(response => response.json()) .then(json => co

如何在元素数组上同步调用异步函数,以便只在对当前元素的异步调用完成后调用下一个异步函数

例如,如果我们看下面的代码

const fetch = require("cross-fetch");

function wait(a) {
    fetch(`https://jsonplaceholder.typicode.com/todos/${a}`)
        .then(response => response.json())
        .then(json => console.log(json));
}
const data = [1, 2, 3, 5, 6, 7, 8, 9, 10];

async function test() {
    for (const ele of data) {
        await wait(ele);
    }
}

test();
每当我执行上述代码时,它都会随机记录响应,但不会根据数组同步记录响应。i、 e

{"userId":1,"id":8,"title":"quo adipisci enim quam ut ab","completed":true}
{"userId":1,"id":9,"title":"molestiae perspiciatis ipsa","completed":false}
{"userId":1,"id":10,"title":"illo est ratione doloremque quia maiores aut","completed":true}
{"userId":1,"id":7,"title":"illo expedita consequatur quia in","completed":false}
{"userId":1,"id":1,"title":"delectus aut autem","completed":false}
{"userId":1,"id":6,"title":"qui ullam ratione quibusdam voluptatem quia omnis","completed":false}
{"userId":1,"id":3,"title":"fugiat veniam minus","completed":false}
{"userId":1,"id":5,"title":"laboriosam mollitia et enim quasi adipisci quia provident illum","completed":false}
{"userId":1,"id":2,"title":"quis ut nam facilis et officia qui","completed":false}

在这里,你可以清楚地看到,这些反应并不有序。是否有任何方法可以同步调用这些函数,但只能在完成当前调用后调用。

您的函数
wait
没有返回其
承诺
,因此您实际上正在唤醒
未定义的
(我很惊讶这不会爆炸)。因此,异步正在以一种火而忘的方式发生。所有承诺都在同一执行帧中启动(而不是在前一个承诺完成时按连续顺序启动)

在此处添加
return
语句:

function wait(a) {
  return fetch(`https://jsonplaceholder.typicode.com/todos/${a}`)
    .then(response => response.json())
    .then(json => console.log(json));
}
通过返回
承诺
,循环中的
等待
现在将阻塞(异步),直到返回的
承诺
完成。现在代码的其余部分按预期运行。

来自MDN,expression

导致异步函数执行暂停,直到承诺得到解决(即,履行或拒绝),并在履行后恢复异步函数的执行。当恢复时,等待表达式的值就是已实现承诺的值

但是,在您的函数中,函数返回的是
null
未定义的
,也来自文档

如果wait运算符后面的表达式的值不是承诺,则它将转换为已解析的承诺

添加一个
返回应该可以修复它

function wait(a) {
    // missing return statement 
    // to fix, add a `return` infront of fetch
    fetch(`https://jsonplaceholder.typicode.com/todos/${a}`)
        .then(response => response.json())
        .then(json => console.log(json));
}

希望这能起作用。

只需将函数代码包装在承诺中,如下所示:

function wait(a) {
  return new Promise((resolve, reject) => {
    fetch(`https://jsonplaceholder.typicode.com/todos/${a}`)
      .then(response => resolve(response.json()))
      .then(json => reject(json));
    });  
}

那么代码的其余部分应该按预期工作。

仍然对它感到困惑吗?你能告诉我它是怎么工作的吗@Hereticmonkey就用你从spender那里得到的答案吧。
null
undefined
在JS中是不同的。
void
函数“返回”
undefined
,而不是
null
function wait(a) {
    return fetch(`https://jsonplaceholder.typicode.com/todos/${a}`)
        .then(response => response.json());
}
const data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];

async function test() {
    for await (const ele of data) {
        await wait(ele).then(json => console.log(JSON.stringify(json)));
    }
}
function wait(a) {
  return new Promise((resolve, reject) => {
    fetch(`https://jsonplaceholder.typicode.com/todos/${a}`)
      .then(response => resolve(response.json()))
      .then(json => reject(json));
    });  
}