[英]Case for having xmlhttprequest available in sync
可以簡單地將多個同步請求封裝為異步請求。
以下代碼中的“func”參數可以例如按順序包含多個同步請求。 這應該為您提供更多的數據功能,與使用DOM作為媒介來對比數據形成鮮明對比。 (還有另外一種方法嗎?自從我使用javaScript以來已經有一段時間了)
function asyncModule(func)
{
"use strict";
var t, args;
t = func.timeout === undefined ? 1 : func.timeout;
args = Array.prototype.slice.call(arguments, 1);
setTimeout(function () {
func.apply(null, args);
}, t);
}
現在我的推理肯定是錯的,因為這是規范所說的:
工作人員之外的同步XMLHttpRequest正在從Web平台中刪除,因為它對最終用戶的體驗有不利影響。 (這是一個需要很多年的漫長過程。)當JavaScript全局環境是文檔環境時,開發人員不得為async參數傳遞false。 強烈建議用戶代理在開發人員工具中警告這種用法,並嘗試在發生時拋出InvalidAccessError異常。 @ https://xhr.spec.whatwg.org/
我認為你會不惜一切代價避免異步請求,而是在異步函數中包裝同步請求。
這是主要問題以及后續行動。
如果沒有那么:
不言而喻,如果他們只是錯誤或半真半假,你就可以自由地揭穿我的任何“主張”。 我對此感到困惑,我告訴你。
請記住,我在終端中測試javaScript,而不是在瀏覽器中。 我在GO編程語言中使用了網絡服務器,一切似乎都運行良好。 直到我在瀏覽器中測試代碼,我得到了這個規范的提示。
這個答案已被編輯。
是的,我的理由是錯誤的!
有兩個角度需要考慮。 異步在javascript中實際意味着什么? 一個異步調用可以阻止另一個異步調用嗎?
javascript中的異步並不意味着腳本將在具有多個callstack的交錯/交替進程中運行。 它可以更像是一個全局定時推遲/推遲命令,一旦有機會就會完全接管。 這意味着異步調用可以阻塞,非阻塞“async:true”部分只是基於xhttprequest實現方式的“技巧”。
這意味着在setTimeout中封裝同步請求可能正在等待 失敗的請求,該請求最終阻止其他無關的異步請求,其中“async:true”功能僅基於其狀態值執行。
這意味着當您需要執行多個依賴於另一個請求的請求時,較舊的瀏覽器支持需要您鏈接請求或使用DOM作為媒介...
幸運的是,Javascript現在有線程。 現在我們可以簡單地使用線程來同步對多個相關請求進行干凈的封裝。 (或任何其他后台任務)
簡而言之:如果瀏覽器位於worker中,瀏覽器不應該有同步運行請求的任何問題。 瀏覽器尚未成為操作系統,但它們更接近。
PS這個答案或多或少是因為反復試驗。 我圍繞firefox做了一些測試用例,觀察到異步請求會停止其他異步請求。 我只是從那個觀察中推斷出來。 如果我仍然遺失某些東西,我不會接受我自己的答案。
編輯(再次..)實際上,有可能使用xhttp.timeout和xhttp.ontimeout。 請參閱超時XMLHttpRequest這意味着如果抽象setTimeout並將其用作調度程序,則可以從錯誤請求中恢復。
// Simple example
function runSchedular(s)
{
setTimeout(function() {
if (s.ptr < callQue.length) {
// Handles rescheduling if needed by pushing the que.
s = s.callQue[s.ptr++](s);
} else {
s.ptr = 0;
s.callQue = [];
s.t = 200;
}
runSchedular(s);
}, s.t);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.