我应该在promise内调用XMLHttpRequest异步吗?

时间:2019-01-09 18:30:50

标签: javascript promise xmlhttprequest

我在XMLHttpRequest中使用了基本的promise。由于promise的异步特性,我一直认为进行XMLHttpRequest同步是可以的,但是由于我的浏览器正在警告我,因此我想确保。

一个mwe将是:

call(arg) {
    return new Promise(resolve => {
        let xhr = new XMLHttpRequest();
        xhr.open('GET', 'http://localhost:8080?' + arg.name, false);
        xhr.send();
        resolve({body: {result: xhr.responseText}});
    });
}

1 个答案:

答案 0 :(得分:2)

  

我应该在Promise之内称XMLHttpRequest异步吗?

是的,异步(不是同步)。

  

由于承诺的异步性质,我一直以为XMLHttpRequest同步就可以了...

不是,原因如下:

  1. 异步与另一个线程上的不同。您仍在阻止UI主线程。

  2. promise执行程序函数(您传递给new Promise的函数)始终以 方式执行。因此,您的call在ajax调用完成之前不会返回,因为它是一个同步调用。

承诺不会改变正在完成的工作的性质。它们只是提供一致的标准化语法来观察工作的完成情况(通常是异步工作,但不一定如此)。

保证异步唯一的事情就是对thencatchfinally处理程序的调用。有关详细信息,请参见此代码段中的评论和结果:

// The promise executor is called *synchronously*.
// This outputs 1, 2, 3, not 1, 3, 2:
console.log(1);
new Promise(resolve => {
  console.log(2);
  resolve();
});
console.log(3);

// `then`, `catch`, and `inally` handlers are called asynchronously, even if
// the promise is already settled (because it would be chaotic to call them
// synchronously *sometimes* [because the promise is already settled when you
// call `then`/`catch/`finally`] but not *other* times [because it isn't
// settled yet when you call `then`/`catch/`finally`]).
// This outputs A, B, C, not A, C, B
console.log("A");
Promise.resolve().then(() => console.log("C"));
console.log("B");

不要做同步Ajax,2019年没有充分的理由。


旁注:如果您想要启用了Promise的ajax,请使用fetch