既然已经不赞成使用“ async:false”,那么执行同步HTTP请求的良好实践是什么?

时间:2019-07-17 14:19:10

标签: javascript jquery ajax rest

我想执行同步的ajax调用,但是我一直收到警告,不建议使用Synchronous XMLHttpRequest。我在互联网上找到的所有信息都已经有好几年了,所以我犹豫要相信我读到的任何东西。有什么建议么?什么是最佳编码实践?

1 个答案:

答案 0 :(得分:0)

同步请求本质上是一种不好的做法。 JavaScript本质上是异步的,请习惯它。

但是,如果要编写与同步代码非常相似的代码,则可以结合使用awaitfetch来做到这一点:

// Purely asynchronous code
fetch('some-url')
  .then(resp => resp.text())
  .then(text => console.log(`Fetched content: ${text.substr(0,10)}...`));

// Using async/await
(async () => {
  const resp = await fetch('some-url');
  const text = await resp.text();
  console.log(`Fetched content: ${text.substr(0,10)}...`);
})();

请注意,await仅可用于异步函数,因此一种实现方法是将代码包装在async IIFE中。

这样,您可以轻松地编写几个HTTP调用,同时保持统一的代码结构,这是一个好习惯!

如果您不关心进行HTTP调用的顺序,则可以使用Promise.all,它可以生成一个承诺,该承诺将在返回所有HTTP调用后立即解决-例如以下示例:

// like this
Promise.all([
  fetch('url-1').then(resp => resp.text()),
  fetch('url-2').then(resp => resp.text()),
])
.then([text1, text2] => {
  // ...
});

// or like this
(async () => {
  const [text1, text2] = await Promise.all([
    fetch('url-1').then(resp => resp.text()),
    fetch('url-2').then(resp => resp.text()),
  ]);
  // ...
})();