簡體   English   中英

javascript中的異步編程(非AJAX)

[英]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調用之后的任何代碼都將立即運行,包括返回調用函數。
  • 如果隊列中有其他定時器處於或超過其延遲或間隔時間,則它們將一次執行一個。
  • 當任何計時器正在運行時,另一個計時器可能會達到其間隔/延遲時間,但在最后一個計時器完成之前不會運行。
  • 某些瀏覽器優先考慮從用戶交互中觸發的事件,例如onclickonmousemove ,在這種情況下,附加到這些事件的函數將以定時器精度為代價執行。
  • 這將持續到有一個開口(之前沒有被稱為定時器或事件處理程序請求執行)。 只有這樣才能運行示例代碼中的函數。 一次一個,第一個可能但不一定先執行。 此外,我猜測一些瀏覽器可能會施加最小延遲時間,這將使任何設置延遲為0毫秒的定時器運行甚至比預期更晚。

顯然,運行這樣的代碼沒有性能優勢。 在每種情況下,它都會使事情需要更長時間才能完成。 但是,如果單個任務花了這么長時間,它會凍結瀏覽器(並且可能會導致“腳本花費太長時間”瀏覽器警告),將它分解成更小的更快的執行部分會有所幫助,這些部分會在一段延遲時間后按順序運行,從而給瀏覽器一些時間來呼吸。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM