栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

不建议使用同步XMLHttpRequest

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

不建议使用同步XMLHttpRequest

该答案已被编辑。

简短的答案: 他们不想在 线程上同步。

对于支持线程/网络工作者的新浏览器而言,该解决方案很简单:

var foo = new Worker("scriptWithSyncRequests.js")

DOM和全局变量都不在工作线程中不可见,但是封装多个同步请求将变得非常容易。

另一种解决方案是切换到异步,但使用浏览器localStorage以及JSON.stringify作为媒介。如果允许执行某些IO,则可以模拟localStorage。
http://caniuse.com/#search=localstorage

只是为了好玩,如果我们只想使用sync来限制自己,就可以使用其他方法:

使用setTimeout很有诱惑力,因为有人可能认为这是将同步请求封装在一起的一种好方法。可悲的是,有一个陷阱。javascript中的异步并不意味着它可以在自己的线程中运行。异步可能会推迟呼叫,等待其他人完成。对我们来说幸运的是,隧道尽头有光,因为您很可能可以同时使用xhttp.timeout和xhttp.ontimeout进行恢复。请参阅超时XMLHttpRequest。 这意味着我们可以实现时间表的微型版本,该时间表可以处理失败的请求并分配时间重试或报告错误。

// The basic idea.function runSchedular(s){    setTimeout(function() {        if (s.ptr < callQueue.length) { // Handles rescheduling if needed by pushing the que. // Remember to set time for xhttp.timeout. // Use xhttp.ontimeout to set default return value for failure. // The pushed function might do something like: (in pesudo) // if !d1 // d1 = get(http...?query); // if !d2 // d2 = get(http...?query); // if (!d1) {pushQue tryAgainLater} // if (!d2) {pushQue tryAgainLater} // if (d1 && d2) {pushQue handleData} s = s.callQueue[s.ptr++](s);        } else { // Clear the que when there is nothing more to do. s.ptr = 0; s.callQueue = []; // You could implement an idle counter and increase this value to free // CPU time. s.t = 200;        }        runSchedular(s);    }, s.t);}


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/427448.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号