【问题标题】:XMLHttpRequest Promise, nested in some sync codeXMLHttpRequest Promise,嵌套在一些同步代码中
【发布时间】:2018-10-12 01:10:06
【问题描述】:

为什么不推荐使用同步 xm​​lhttprequest?

如果浏览器等待数据而不是 在未完成数据查询的情况下打开它以供进一步点击。

我想编写一个一步一步的程序。 此外,代码应该结构合理,我想知道如何 我可以在没有承诺的情况下实现这一点。

有没有“不推荐”的 xmlhttprequest 同步替代方案?

谢谢 托马斯

【问题讨论】:

  • 您在哪里看到 xmlhttprequest 已被弃用?请详细说明您要完成的工作,并提供一些代码以便其他人可以更好地帮助您。
  • @BigHeadCreations 是。 :)
  • 为什么需要同步调用?为什么?因为它会锁定浏览器并可能导致问题。一个简单的 promise 结构可以和同步调用一样。
  • chrome 带来以下警告:
  • Test2.html:34 [弃用] 主线程上的同步 XMLHttpRequest 已弃用,因为它会对最终用户的体验产生不利影响。如需更多帮助,请查看xhr.spec.whatwg.org

标签: javascript asynchronous promise xmlhttprequest synchronous


【解决方案1】:

为什么不推荐使用同步 xm​​lhttprequest?

因为它会阻止 Event Loop 并为您的最终用户提供糟糕的用户体验。

基本上它会在页面发生时“冻结”页面。

如果浏览器等待数据,我将不胜感激

但这不是浏览器的工作方式。幸运的是,通过实践,浏览器的工作方式开始变得非常有意义 - 足以让以前主要使用同步 I/O(如 Python)的语言也添加“承诺”。

我想编写一个一步接一个的程序。

您可以在 JavaScript 中return responses from asynchronous calls。使用 async/await 代码看起来非常相似且可读。见the async function mdn page

此外,代码应该结构合理,我想知道如何在没有承诺地狱的情况下实现这一点。

“promise-hell”指的是一旦一个函数对它调用的所有其他函数进行 I/O 操作。我不相信这是一件坏事或有什么问题

async function sequence() {
   let one = await fetch('/your-endpoint?someParam').then(x => x.json());
   // do something with one
   let param = one.param;
   let two = await fetch('/your-other?param=' + param).then(x => x.json());
   // do something with second call
}
sequence();

也就是说,async/await 可以让你同步编写异步代码。

不要指望一下子就明白这一切——没关系,这需要时间。

【讨论】:

    猜你喜欢
    • 2015-03-15
    • 2020-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-08
    相关资源
    最近更新 更多