[英]Asynchronous programming in javascript (NOT AJAX)
是不是可以在javascript(AJAX旁邊)中異步處理? 例如,要同時迭代多個數組。 怎么做? 一個簡短的例子會很好。 由於所有的ajax污染,尋找這個很難,這不是我想要的。
提前致謝。
使用web Workers 。 但請記住,這是一項非常新的功能,並非所有瀏覽器都得到完全支持。
你可以使用setTimeout
。
setTimeout(function () { iterateArray(array1); reportDone(1); }, 0);
setTimeout(function () { iterateArray(array2); reportDone(2); }, 0);
我不確定它會是多么並發,但它是一個異步編程模型。
正如Grumdrig所說,您可以編寫如下代碼:
setTimeout(function () { iterateArray(array1); reportDone(1); }, 0);
setTimeout(function () { iterateArray(array2); reportDone(2); }, 0);
但它仍然不會同時運行。 以下是調用此類超時后發生的事情的一般概念:
setTimeout
調用之后的任何代碼都將立即運行,包括返回調用函數。 onclick
和onmousemove
,在這種情況下,附加到這些事件的函數將以定時器精度為代價執行。 顯然,運行這樣的代碼沒有性能優勢。 在每種情況下,它都會使事情需要更長時間才能完成。 但是,如果單個任務花了這么長時間,它會凍結瀏覽器(並且可能會導致“腳本花費太長時間”瀏覽器警告),將它分解成更小的更快的執行部分會有所幫助,這些部分會在一段延遲時間后按順序運行,從而給瀏覽器一些時間來呼吸。
Web Workers已被提及,如果您不關心IE兼容性,那么您可以使用它們來實現真正的並發性。 然而,出於安全原因,對其使用存在嚴重限制。 對於其中一個,他們無法以任何方式與DOM交互,這意味着對頁面的任何更改仍然必須同步完成。 此外,傳遞給工作人員和從工作人員傳遞的所有數據都在傳輸中序列化,這意味着無法使用真正的Javascript對象。 話雖如此,對於密集型數據處理,Web Workers可能是比將功能分解為多個定時器延遲任務更好的解決方案。
該領域的一個新發展是HTML5 Web Workers。
JavaScript通常是單線程的; 你不能一次做幾件事。 如果您的JavaScript代碼太慢,則需要卸載工作。 其他人已經注意到,新方法是使用網絡工作者 。 舊的方法通常是使用AJAX,而是在服務器上完成工作。 (無論是使用Web worker還是使用AJAX,都必須序列化數組並對結果進行反序列化)
我不得不同意MooGoo,我也想知道你為什么要一次性經歷如此龐大的陣列。
有一個名為StratifiedJS的 JavaScript擴展,只要它們是異步的,它允許你同時做多個事情。 此外,網絡工作者是一個尷尬的“解決方案”,只是讓事情變得更復雜,而且,它們在IE中不起作用。
在StratifiedJS你可以寫。
waitfor {
// do something long lasting here...
}
and {
// do something else at the same time...
}
// and when you get here, both are done
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.