這裡蒐索程式師資訊,查找有用的技術資料
當前位置:首頁 » 網頁前端 » 前端項目中的非同步
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

前端項目中的非同步

發布時間: 2022-10-01 16:19:44

前端非同步刷新問題

這個問題我前段時間也在網上找了下,你可以看看 http://bbs.csdn.net/topics/392062631 ,也是div里載入刷新頁面

Ⅱ 前端匯流排內存非同步什麼意思

內存非同步是指
只提高內存運行頻率 加速內存運行效率
而不改變匯流排頻率的一種技術
註:提高匯流排頻率是超頻 而內存非同步技術不是超頻,只是讓內存發揮出最大效能

Ⅲ js如何非同步執行方法

functionmyThread(callback){

returnsetTimeout(1000*10,function(){

$("#div").append("<p>hello</p>");//10秒後在div中加一個行,然後在執行callback函數

callback();

});

}

用回調函數

functionA(fun){

vartemp=100;

temp=temp*temp;

window.setTimeout(function(){

fun(temp);

},0);

alert("a函數:"+temp);

}

functionB(r){

alert("b函數"+r);

}

A(B);//調用

Ⅳ JS中的非同步操作有哪些

JS中的非同步操作:
1、定時器都是非同步操作
2、事件綁定都是非同步操作
3、AJAX中一般我們都採取非同步操作(也可以同步)
4、回調函數可以理解為非同步(不是嚴謹的非同步操作)

Ⅳ 如何選擇和評價前端ajax非同步渲染與後端mvc渲染

1、到今天,幾乎沒人會禁掉js。
2、php生成全部代碼,肯定比只生成框架,然後ajax要快。原因是,兩種情況下,你的網線傳輸的數據K數基本是一樣的,如果js執行innerHTML的話,會修改dom,造成重繪和重排,代價比較大。即使php只負責框子,但一般php項目都是使用了模板引擎的,即使提供框子也需要動用模板引擎,那麼模板引擎處理框子和處理全部內容,是幾乎感覺不出時間區別的。如果數據量大,那麼ajax的優勢是可以分段下載數據,這樣就顯得比php快。
3、忽略php比ajax快這種情況,它們的區別就是看使用場合,而且沒有必須的規則,所以不要太較真。
ajax永遠是跟「安全」的「頻繁更新」的「格式的批量數據」以及「數據緩存」相關,而且用戶沒有慾望看舊的數據,也就是說,用戶沒興趣、沒必要點後退鍵,看老數據。因為ajax默認不支持後退鍵,如果想實現後退,需要做大量的工作。
也就是說:
A、如果抓的數據是敏感的,那麼不要ajax,不敏感的話就可以ajax。如果抓的不是格式的批量數據,而是別的東西,比如抓了一條視頻地址,即然只有一條,沒必要ajax。如果預判用戶會查閱大量的數據,那麼用ajax先抓一批數據(或者首批數據用php輸出),然後後台慢慢悠悠的再繼續抓其他數據,然後緩存起來,這時候用ajax。
B、如果你的頁面呈現完畢之後處於數據靜止狀態(不進行數據頻繁更新),那就肯定是用php。(如果頁面顯示了當天日期,昨天是15日,今天是16日,也認為是數據靜止。如果在某個位置顯示了你的用戶名,也認為是數據靜止。)
C、如果你的頁面呈現完畢之後不處於數據靜止狀態,也就是說在你觀看頁面的幾十秒期間內,伺服器資料庫就有了大批量的數據更新,而且你有必要馬上看到這些更新,那麼就用ajax。或者說你的頁面打開之後可能需要保持半小時、一小時不關閉,而且要隨時看到數據更新,那肯定要用ajax。
從上述我的理論來講,籠統說,你的公司內部網站,大量利用php,加上一丟丟的ajax,就對了。
關於分頁,有人說用ajax來獲取分頁信息,豈不是美哉?這里道理其實是一樣的,列表可以視為格式的批量數據,而且緩存有利於翻頁,所以可以ajax。但是有可能列表頁更新很慢,幾天幾周才新增一條,那又可以考慮php。所以這次就看情況而定。
如果一個網頁展示了不算多的三四十條批量數據,今天是這些數據,明天仍是這些數據,沒變過,這時候盡管符合「格式的批量數據」,但也推薦php,不推薦ajax。所以我才說,公司內網,可以大量用php。

對於php生成了html的情況,那就跟php無關了,如果一個html頁面內的數據總要更新,當然ajax,沒疑問。

Ⅵ java web 項目中如何實現非同步方式分頁啊

使用struct裡面的dojo插件撒,不明白在hi我

Ⅶ 怎樣用JS實現非同步轉同步

源起

小飛是一名剛入行前端不久的新人,因為進到了某個大公司,儼然成為了學弟學妹眼中'大神',大家遇到js問題都喜歡問他,這不,此時他的qq彈出了這樣一條消息

"hi,大神在嗎?我有個問題想問,現在我們的代碼裡面有這樣的東西,可是得不到正確的返回結果

1234567functiongetDataByAjax () {return$.ajax(...postParam)}vardata = getDataByAjax()if(data) {console.log(data.info)}

"哦,你這里是非同步調用,不能直接獲得返回值,你要把if語句寫到回調函數中",小飛不假思索的說到,對於一個『專業』的fe來說,這根本不是一個問題。
「可是我希望只是改造getDataByAjax這個方法,讓後面的代碼成立。」
「研究這個沒有意義,非同步是js的精髓,同步的話會阻塞js調用,超級慢的,但是你要一再堅持的話,用async:true就好了」
「不愧是大神,我回去立刻試一試,么么噠」

兩天後,她哭喪著臉登上了qq
「試了一下你的方法,但是根本行不通,哭~~」
「別急,我看看你這個postParam的參數行嗎」

123456{...dataType:'jsonp',async:true...}

"這是一個jsonp請求啊,老掉牙的東西了,,jsonp請求是沒有辦法同步的"
「我知道jsonp請求的原理是通過script標簽實現的,但是,你看,script也是支持同步的呀,你看tags/attscriptasync.asp」
「額,那可能是jquery沒有實現吧,哈哈」
「大神,你能幫我實現一個jsonp的同步調用方式嘛,拜託了(星星眼)」
雖然他有點奇怪jquery為什麼沒有實現,但是既然w3school的標准擺在那裡,碼兩行代碼又沒什麼,

loadJsonpSync = (url) => {varresult;window.callback1 = (data) => (result = data)lethead = window.document.getElementsByTagName('head')[0]letjs = window.document.createElement('script')js.setAttribute('type','text/javascript')js.setAttribute('async','sync')// 這句顯式聲明強調src不是按照非同步方式調用的js.setAttribute('src', url)head.appendChild(js)returnresult}

額,運行起來結果竟然是undefined!w3cshool的文檔竟然也不準,還權威呢,我看也不怎麼著,小飛暗自想到。

「剛才試了一下,w3school文檔上寫的有問題,這個非同步屬性根本就是錯的」
「可是我剛還試過一次這個,我確認是好的呀」

12<script src="loop50000 && put('frist').js"></script><script src="put('second').js"></script>

(有興趣的同學可以實現以下兩個js,並且加上async的標簽進行嘗試。)
「這個,我就搞不清楚了」,小飛訕訕的說到
對方已離線

抽象

關於這個問題,相信不只是小飛,很多人都難以解答。為什麼ajax可以做到同步,但jsonp不行,推廣到nodejs上,為什麼readFile也可以做到同步(readFileSync),但有的庫卻不行。
(至於script的async選項我們暫時避而不談,是因為現在的知識維度暫時還不夠,但是不要著急,下文中會給出明確的解釋)
現在,讓我們以計算機科學的角度抽象這個問題:

我們是否可以將非同步代碼轉化為同步代碼呢?(ASYNCCALL => SYNCCALL)

既然是抽象問題,那麼我們就可以不從工程角度/性能角度/實現語言等等等方面來看(同步比非同步效率低下),每增加一個維度,復雜程度將以幾何爆炸般增長下去。

首先,我們來明確一點,==在計算機科學領域==同步和非同步的定義

同步(英語:Synchronization),指對在一個系統中所發生的事件(event)之間進行協調,在時間上出現一致性與統一化的現象。在系統中進行同步,也被稱為及時(in time)、同步化的(synchronous、in sync)。--摘自網路
非同步的概念和同步相對。即時間不一致,不統一

明確了這一點,我們可以藉助甘特圖來表示同步和非同步

注意看我們標紅的地方,如果你完成了小測驗1,就會得到和這張圖一致的順序

==同步執行的代碼片段必然在非同步之前。==

所以,無論從理論還是實際出發,我們都不得不承認,在js中,把非同步方法改成同步方法這個命題是水月鏡花

哦對了,最後還需要解釋一下最開始我們埋下的坑, 為什麼jsonp中的async沒有生效,現在解釋起來真的是相當輕松,即document.appendChild的動作是交由dom渲染線程完成的,所謂的async阻塞的是dom的解析,而非js引擎的阻塞。實際上,在async獲取資源後,與js引擎的交互依舊是push taskQueue的動作,也就是我們所說的async call

推薦閱讀: 關於dom解析請大家參考webkit技術內幕第九章資源載入部分

峰迴路轉

相信很多新潮的同學已經開始運用切了async/await語法,在下面的語法中,getAjax1和console之間的具有同步的特性

1234asyncfunction() {vardata = await getAjax1()console.log(data)}

講完了event loop和非同步的本質,我們來重新審視一下async/await。
老天,這段代碼親手推翻了==同步執行的代碼片段必然在非同步之前。== 的黃金定律!
驚不驚喜,意不意外,這在我們的模型里如同三體里的質子一樣的存在。我們重新審視了一遍上面的模型,實在找不到漏洞,找不到任何可以推翻的點,所以真的必須承認,async/await絕對是一個超級神奇的魔法。
到這里來看我們不得不暫時放棄前面的推論,從async/await本身來看這個問題
相信很多人都會說,async/await是CO的語法糖,CO又是generator/promise的語法糖,好的,那我們不妨去掉這層語法糖,來看看這種代碼的本質, 關於CO,讀的人太多了,我實在不好老生常談,可以看看這篇文章,咱們就直接繞過去了,這里給出一個簡易的實現
/5800210.html

functionwrap(wait) {variteriter = wait()const f = () => {const { value } = iter.next()value && value.then(f)}f()}function*wait() {varp = () =>newPromise(resolve => {setTimeout(() => resolve(), 3000)})yieldp()console.log('unlock1')yieldp()console.log('unlock2')console.log('it's sync!!')}

終於,我們發現了問題的關鍵,如果單純的看wait生成器(注意,不是普通的函數),是不是覺得非常眼熟。這就是我們最開始提出的spinlock偽代碼!!!
這個已經被我們完完全全的否定過了,js不可能存在自旋鎖,事出反常必有妖,是的,yield和*就是表演async/await魔法的妖精。
generator和yield字面上含義。Gennerator叫做生成器,yield這塊ruby,python,js等各種語言界爭議很大,但是大多數人對於『讓權』這個概念是認同的(以前看到過maillist上面的爭論,但是具體的內容已經找不到了)

擴展閱讀---ruby元編程 閉包章節yield(ruby語義下的yield)

所謂讓權,是指cpu在執行時讓出使用權利,操作系統的角度來看就是『掛起』原語,在eventloop的語義下,似乎是暫存起當時正在執行的代碼塊(在我們的eventloop裡面對應runPart),然後順序的執行下一個程序塊。
我們可以修改eventloop來實現讓權機制

小測驗2 修改eventloop使之支持yield原語

至此,通過修改eventloop模型固然可以解決問題,但是,這並不能被稱之為魔法。

和諧共存的世界

實際上通過babel,我們可以輕松的降級使用yield,(在es5的世界使用讓權的概念!!)
看似不可能的事情,現在,讓我們撿起曾經論證過的
==同步執行的代碼片段必然在非同步之前。== 這個定理,在此基礎上進行進行逆否轉化

==在非同步代碼執行之後的代碼必然不是同步執行的(非同步的)。==

這是一個圈子裡人盡皆知的話,但直到現在他才變得有說服力(我們繞了一個好長的圈子)
現在,讓我們允許使用callback,不使用generator/yield的情況下完成一個wait generator相同的功能!!!

functionwait() {const p = () => ({value:newPromise(resolve => setTimeout(() => resolve(), 3000))})letstate = {next: () => {state.next = programPartreturnp()}}functionprogramPart() {console.log('unlocked1')state.next = programPart2returnp()}functionprogramPart2() {console.log('unlocked2')console.log('it's sync!!')return{value: void 0}}returnstate}

太棒了,我們成功的完成了generator到function的轉化(雖然成本高昂),同時,這段代碼本身也解釋清楚了generator的本質,高階函數,片段生成器,或者直接叫做函數生成器!這和scip上的翻譯完全一致,同時擁有自己的狀態(有限狀態機)

推薦閱讀 計算機程序的構造和解釋 第一章generator部分
小測驗3 實際上我們提供的解決方式存在缺陷,請從作用域角度談談

其實,在不知不覺中,我們已經重新發明了計算機科學中大名鼎鼎的CPS變換
Continuation-passing_style

最後的最後,容我向大家介紹一下facebook的CPS自動變換工具--regenerator。他在我們的基礎上修正了作用域的缺陷,讓generator在es5的世界裡自然優雅。我們向facebook脫帽致敬!!egenerator

後記

同步非同步 可以說是整個圈子裡面最喜歡談論的問題,但是,談來談去,似乎絕大多數變成了所謂的『約定俗稱』,大家意味追求新技術的同時,卻並不關心新技術是如何在老技術上傳承發展的,知其然而不知其所以然,人雲亦雲的寫著似是而非的js。

==技術,不應該浮躁==

PS: 最大的功勞不是CO,也不是babel。regenerator的出現比babel早幾個月,而且最初的實現是基於esprima/recast的,關於resprima/recast,國內似乎了解的並不多,其實在babel剛剛誕生之際, esprima/esprima-fb/acron 以及recast/jstransfrom/babel-generator幾大族系圍繞著react產生過一場激烈的斗爭,或許將來的某一天,我會再從實現細節上談一談為什麼babel笑到了最後~~~~

Ⅷ vue前端非同步與頁面渲染問題:怎樣讓子非同步函數完成後頁面再渲染

非同步載入完成後 調用ui線程的handle來sendMessage 在handle的dispatchMessage中處理消息,做progressBar的隱藏處理

Ⅸ nodeJS中,非同步的具體實現者是什麼

在現在的項目開發中,任何一個大型項目絕對不是簡簡單單的採用一個種語言和一種框架,因為每種語言和框架各有優勢,與其死守一個,不與取各家之所長,依次得到一個高性能、搞擴展的產品。

對於一個.NET開發者,尤其是主要從事Web開發的.NET程序員,個人覺得有必要學習一門性能優越的Web平台開發語言。一個開發者不能簡簡單單的只學習一門語言,思維應該開闊,從各個方面去看待同樣的一個問題,這樣或許會得到另一番效果和見解,個人認為應該學習一下其他的語言,這樣有利於我們對比語言的優勢和缺點,例如java、nodejs、python等等。對於Nodejs這個JavaScript平台,個人覺得.NET程序員有必要學習一下,因為學習NodeJS有助於我們構建一個高性能的Web平台。

NodeJS具有事件驅動、非阻塞I/O等特點,可以很好的處理I/O操作。Node面向網路且擅長並行I/O,能夠有效地組織起更多的硬體資源。

這篇博客就來簡單的介紹一下NodeJS的非同步I/O特點。

一.NodeJS概述:

要學習一個語言或者平台,我們首先應該知道其定義,依據定義來擴展我們的學習思路。Node的定義:」一個大獎在Chrome JavaScript運行時上的平台,用於構建高速、可伸縮的網路程序。NodeJS作為一個非同步事件驅動的JavaScript運行時,旨在構建可擴展的網路應用程序。「有關nodejs的背景介紹和安裝方法,這里就沒有必要介紹了,因為對於nodejs的安裝是比較簡單,所以在這里贅述就有些顯得浪費時間。

學習完Node的定義特點,可能很多人都會好奇這個平台的適用場景是什麼,以便在實際的項目開發中應用,不然學習這個就沒有意義。主要的應用場景:前後端編程語言環境統一;高性能I/O用於實時應用;並行I/O使得使用者可以更高效地利用分布式環境;並行I/O有效利用穩定介面提升Web渲染能力;雲平台的支持;游戲開發(這可能是很多開發者在意的,畢竟現在的游戲開發火熱程度已經到了無以附加的地步);工具類應用,與較多的工具方法,使得開發效率大大的提升。

NodeJS非同步I/O模型的基本要素:事件循環、觀察者、請求對象、I/O線程池這四個共同構成。接下來我們具體了解一下這些知識。

二.NodeJS非同步I/O解析:

對於Nginx伺服器,很多人都是比較的熟悉,Nginx採用純C編寫而成,用於做Web伺服器,在反向代理和負載均衡等服務方面有很好的優勢。Node與Nginx伺服器有著相似的地方,都是採用事件驅動。

瀏覽器中JavaScript在單線程上執行,而且還與UI渲染共用一個線程,JavaScript在執行的時候UI渲染和響應應是出於停滯狀態。(如果腳本執行的時間超過100毫秒,用戶就會感到頁面卡頓)。遇到這些情況,我們就會想到非同步的方式消除這些等待的問題,對於非同步和同步的概念就不做介紹了。

=接下來我們具體的來了解一下NodeJS的事件驅動和非阻塞I/O這些特點,了解這些對於我們更好的學習NodeJS開發和構建高性能的Web平台有更加深遠的意義。

1.I/O操作概述:

I/O操作對於任何一個開發者來說都不會陌生,現在我們就簡單的談一下NodeJS的I.O操作。I/O操作分為:單線程串列依次執行;多線程並行執行。這兩種方式各有優勢和缺點,多線程的代價在於創建線程和執行期線程上下文切換的開銷較大,並且多線程面臨鎖、狀態同步的問題。單線程安裝順序執行,在執行中任何一個稍慢都會導致後續執行代碼阻塞。對於任務的串列執行(概念上類似於同步執行)和任務的並行執行的描述有如下圖:

varconfig=require('./config.json');
varfs=require("fs");
varhttp=require('http');
varurl_mole=require("url");

http.createServer(function(request,response){
varkey=url_mole.parse(request.url).query.replace('key=','');
switch(request.method){
case'GET'://
fs.readFile(config.dataPath+key,'utf8',function(err,value){
if(err){
//ReturnFileNotFoundiffilehasn'tyetbeencreated
response.writeHead(404,{'Content-Type':'text/plain'});
response.end("Thefile("+config.dataPath+key+")doesnotyetexist.");
}else{
//Ifthefileexists,
varsorted=value.split(config.sortSplitString).sort().join('');
response.writeHead(200,{'Content-Type':'text/plain'});
response.end(sorted);
}
});
break;
case'POST'://
varpostData='';
request
.on('data',function(data){
postData+=data;
})
.on('end',function(){
fs.appendFile(config.dataPath+key,postData,function(err){
if(err){
//Returnerrorifunabletocreate/appendtothefile
response.writeHead(400,{'Content-Type':'text/plain'});
response.end('Error:Unabletowritefile:'+err);
}else{
//,return"success"response
response.writeHead(200,{'Content-Type':'text/plain'});
response.end('success');
}
});
});
break;
default:
response.writeHead(400,{'Content-Type':'text/plain'});
response.end("Error:BadHTTPmethod:"+request.method);
}
}).listen(config.serverPort);

console.log('synchronousserverisrunning:',config.serverPort);

四.總結:

這篇博文是個人初次嘗試NodeJS的一個小總結,如有寫的不好還望大家多多的包含和指正。對於程序員來說,需要做的就是一直不停的學習,無論是否是自己主要從事的語言,對於學習多種語言,可以更加有助我們了解編程,對於一個開發者來說,最終的就是思想,因為語言的特性和框架的應用,一個熟練的編程者學習起來並不是難事,難就難在我們對於語言和框架的設計理念的理解。