我正在努力想出一个动态的解决方案,我有一个项目数组,我需要为数组中的每个项目发送一个POST请求,但我不想发送下一个请求,直到前一个promise 得到解决.

因此动态链接.then()个方法,即发送第一个POST请求,在发送第二个POST请求之前等待解析,在发送第三个POST请求之前等待解析第二个,等等.

下面是我的静态代码,我在其中为命令有效负载数组中的第一个项目发送POST请求,然后在解析第一个项目后发送第二个项目的POST请求.

const commandPayloads = await createInitialCommands(copiedCommands);

  commandPOSTFetch(commandPayloads[0], newResponseSetID).then(() => {
    commandPOSTFetch(commandPayloads[1], newResponseSetID);
  });

const commandPOSTFetch = async (command, newResponseSetID) => {
  const res = await fetch(`https://${someWebSite}/${appID}//${interactionID}/response/${newResponseSetID}/commands.json`,
    {
      method: "POST",
      headers: {
        "Content-Type": "application/json",
      },
      body: JSON.stringify(command),
    }
  );
  const data = await res.json();
  return data;
};

如果数组中有2个项目,上面的示例是有效的,但如果我有2个以上的项目怎么办?

如何根据数组中的项数使此逻辑动态化,以便只有在解析前一个请求之后才按顺序发送POST请求?

*使用For循环进行更新

  commandPayloads.forEach(async (command, i) => {
    const data = await commandPOSTFetch(command, newResponseSetID)
    console.log('in loop', data);
  });

推荐答案

根据记录,最简单的事情就是使用一个老式的for循环(实际上,考虑到"等到一件事情完成后再做下一件事情"的要求,几乎是唯一的方法):

let listOfThings = whatever;
for (let i = 0; i < listOfThings.length; ++i)
    const asyncResult = await somefunc(listOfThings[i]);
    // ...
}

在这种情况下,for循环比.forEach()甚至.map()循环更好的原因是,在async函数中,这await个表达式将真正等待,直到每个promise 都得到满足,然后才继续进行下一次迭代.(显然,在真正的代码中,您需要处理异常等.)

有时,您不需要对事物进行排序.在这种情况下,使用.map()收集一组Promise对象,然后这些对象可以与await Promise.all(collected)一起使用,这是非常好的.但当您确实想要一个严格的先有一个序列时,简单的循环是最好的 Select .

Javascript相关问答推荐

如何确保滚动时响应式图像保持在文本图像布局中的顶部?

如何计算数组子级的深度- Vue.js

react 页面更改类别时如何返回第0页

如何按预期聚合SON数据?

如何在使用fast-xml-parser构建ML时包括属性值?

使用javascript将Plotly Expandable Sparkline转换为HighCharter Plot在bslib卡中

在网页上添加谷歌亵渎词

在Vite React库中添加子模块路径

Mongoose post hook在使用await保存时不返回Postman响应

处理时间和字符串时MySQL表中显示的日期无效

使用js构造一个html<;ath&>元素并不能使其正确呈现

自定义确认组件未在vue.js的v菜单内打开

<;img>;标记无法呈现图像

有效路径同时显示有效路径组件和不存在的路径组件

如果一个字符串前面有点、空格或无字符串,后面有空格、连字符或无字符串,则匹配正则表达式

为什么在函数中添加粒子的速率大于删除粒子的速率?

Phaser3 preFX addGlow不支持zoom

将相关数据组合到两个不同的数组中

构建器模式与参数对象输入

使用createBrowserRoutVS BrowserRouter的Reaction路由