同步请求踩坑记录

114 阅读1分钟

排查记录

近日遇见一个很奇怪的问题,某个第三方功能模块调起时,会导致整个页面卡顿。

观察其火焰图:

image.png

现象非常奇怪,调用栈也没有script在执行,纯idle时间。

经过后续观察,发现有个耗时很长的请求,请求时间和卡顿时间基本一致:

image.png

那请求为什么会阻塞整个进程呢?而且火焰图基本都是空闲时间...

后续又经过一番排查,发现了罪魁祸首-同步请求

image.png

因为默认是异步请求,所以平时还没注意到。而第三方的sdk开启了同步请求功能,至此导致请求的时候整个页面被卡顿。

反思

虽然问题定位解决了,但是又有新的问题:同步请求有啥用呢?看起来没有收益还会阻塞整个进程 = =。

根据MDN的说明,可以在worker中使用:

self.onmessage = function (oEvent) {
  if (oEvent.data === "Hello") {
    var oReq = new XMLHttpRequest();
    oReq.open("GET", "myFile.txt", false); // 同步请求
    oReq.send(null);
    self.postMessage(oReq.responseText);
  }
};

因为worker本身就是异步的,所以不会阻塞主进程。