我在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}});
});
}
答案 0 :(得分:2)
我应该在Promise之内称XMLHttpRequest异步吗?
是的,异步(不是同步)。
由于承诺的异步性质,我一直以为
XMLHttpRequest
同步就可以了...
不是,原因如下:
异步与另一个线程上的不同。您仍在阻止UI主线程。
promise执行程序函数(您传递给new Promise
的函数)始终以 方式执行。因此,您的call
在ajax调用完成之前不会返回,因为它是一个同步调用。
承诺不会改变正在完成的工作的性质。它们只是提供一致的标准化语法来观察工作的完成情况(通常是异步工作,但不一定如此)。
保证异步唯一的事情就是对then
,catch
和finally
处理程序的调用。有关详细信息,请参见此代码段中的评论和结果:
// 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
。