① 前端開發中如何實現非同步編程
非同步編程其實很常見,特別是在出線Node.js之後,非同步編程更是讓很多開發者受益。那麼回到最初的地方,傳統的前端開發中如何實現非同步編程呢?下面列舉了js實現非同步編程的四種方式。
方法一:使用回調函數
方法二:事件監聽
可以定義一個事件,並為這個事件設定處理函數。這樣只有當這個時間發生的情況下,對應的處理函數才會被執行。
方法三:事件的發布/訂閱
這個模式在NodeJS以及其他JS框架中都有實現,是一個非常常用的非同步編程方式。具體的原理及實現方法可以參考我之前的博客:http://blog.csdn.net/fareise/article/details/52198877《 Node中EventEmitter以及如何實現JavaScript中的訂閱/發布模式》,裡面有比較詳細的解析。
方法四:Promise模式
ES6中提供了原生的Promise對象,這個模式最開始只是一個構想,後來由一些框架庫實現。Promise對象代表了未來才會知道結果的事件。
Promise的基本思路就是,將需要非同步執行的事件儲存起來,然後根據非同步事件之行後的結果狀態執行下一步的操作。具體的Promise對象的原理和ES6中的使用方法將在下一篇文章中更加深入的進行介紹。
② 深刻理解ajax中同步和非同步的區別和使用場景
你應該知道同步和非同步的區別在於線程是否堵塞還有延遲問題,其實我在開發中也遇到過,同步和非同步獲取返回賦值問題。
如果你是非同步返回在賦值變數你會發現是undefined,這時候如果這時候你要看你請求的數量,如果超過5個還是執行非同步吧,否則線程堵塞會影響客戶體驗。
同步的好處是能隨時獲取返回並賦值。
③ notification的使用場景是什麼同步還是非同步
與javascript中的事件機制不同,ios里的事件廣播機制是同步的,默認情況下,廣播一個通知,會阻塞後面的代碼:
Objc代碼
-(void) clicked
{
NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
[center postNotificationName:@"event_happend" object:self];
NSLog(@"all handler done");
}
按下按鈕後,發送一個廣播,此前已經注冊了2個此事件的偵聽者
Objc代碼
-(id) init
{
self = [super init];
if(self){
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(whenReceive:) name:@"event_happend" object:nil];
}
return self;
}
-(void) whenReceive:(NSNotification*) notification
{
NSLog(@"im1111");
}
Objc代碼
-(id) init
{
self = [super init];
if(self){
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(whenReceive:) name:@"event_happend" object:nil];
}
return self;
}
-(void) whenReceive:(NSNotification*) notification
{
NSLog(@"im22222");
}
執行這段代碼,首先會輸出im1111,然後是im22222,最後才是all handler done。調試發現,代碼始終是跑在同一個線程中(廣播事件的線程),廣播事件之後的代碼被阻塞,直到所有的偵聽者都執行完響應
所以,由於NotificationCenter的這個特性,如果希望廣播的事件非同步處理,則需要在偵聽者的方法里開啟新線程。應該把Notification作為組件間解耦的方式,而不是利用它來實現非同步處理
④ AJAX中同步和非同步的區別和使用場景
Ajax同步,就是必須在執行完這個請求後才能操作下面的DOM元素,一般大多是非同步的,為了用戶體驗
⑤ 非同步Servlet在什麼樣的場景下能發揮作用
與javascript事件機制同ios事件廣播機制同步默認情況廣播通知阻塞面代碼: Objc代碼 -(void) clicked { NSNotificationCenter *center = [NSNotificationCenter defaultCenter]; [center postNotificationName:@"event_happend" object:self]; NSLog(@"all handler done"); } 按按鈕發送廣播前已經注冊二事件偵聽者 Objc代碼 -(id) init { self = [super init]; if(self){ [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(whenReceive:) name:@"event_happend" object:nil]; } return self; } -(void) whenReceive:(NSNotification*) notification { NSLog(@"im一一一一"); } Objc代碼 -(id) init { self = [super init]; if(self){ [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(whenReceive:) name:@"event_happend" object:nil]; } return self; } -(void) whenReceive:(NSNotification*) notification { NSLog(@"im二二二二二"); } 執行段代碼首先輸im一一一一im二二二二二才all handler done調試發現代碼始終跑同線程(廣播事件線程)廣播事件代碼阻塞直所偵聽者都執行完響應 所由於NotificationCenter特性希望廣播事件非同步處理則需要偵聽者啟新線程應該Notification作組件間解耦式利用實現非同步處
⑥ AJAX:論述同步通信方式和非同步通信方式的優缺點及使用場景
ajax同步:程序一直按順序執行下去。可控符合邏輯無bug。 步驟。提交請求執行事件。事件執行請求伺服器處理。伺服器處理完畢返回事件繼續執行或者結束。
ajax非同步:程序一同執行。狀態默認不可控。使用回調才能變成可控狀態。步驟。提交請求。執行事件。請求伺服器處理。事件繼續執行。
通俗點說。就是同步數據會按流程走。非同步有可能伺服器的數據沒返回。事件已經執行走了。非同步會有一個執行時間的問題。而同步沒有
⑦ 在Java電商項目中同步和非同步應用在哪些場景
這個很簡單,高並發有多種解決方法:
1、從代碼上分入手,必須得保證代碼沒有冗餘,不要有廢代碼;
2、從伺服器上入手,高並發一台伺服器並發量有限,我們可以採用多台伺服器來分擔壓力;
3、從存儲方便入手,像我們一般高並發但是數據卻可以不用存到資料庫中的,我們就存在內存中,因為讀內存的速度是資料庫的n倍。
⑧ 為什麼要用nodejs服務
總的來說,Node.js的應用場景
1) 適合
JSON APIs——構建一個Rest/JSON API服務,Node.js可以充分發揮其非阻塞IO模型以及JavaScript對JSON的功能支持(如JSON.stringfy函數)
單頁面、多Ajax請求應用——如Gmail,前端有大量的非同步請求,需要服務後端有極高的響應速度
基於Node.js開發Unix命令行工具——Node.js可以大量生產子進程,並以流的方式輸出,這使得它非常適合做Unix命令行工具
流式數據——傳統的Web應用,通常會將HTTP請求和響應看成是原子事件。而Node.js會充分利用流式數據這個特點,構建非常酷的應用。如實時文件上傳系統transloadit
准實時應用系統——如聊天系統、微博系統,但Javascript是有垃圾回收機制的,這就意味著,系統的響應時間是不平滑的(GC垃圾回收會導致系統這一時刻停止工作)。如果想要構建硬實時應用系統,Erlang是個不錯的選擇
2) 不適合
CPU使用率較重、IO使用率較輕的應用——如視頻編碼、人工智慧等,Node.js的優勢無法發揮
簡單Web應用——此類應用的特點是,流量低、物理架構簡單,Node.js無法提供像Ruby的Rails或者Python的Django這樣強大的框架
NoSQL + Node.js——如果僅僅是為了追求時髦,且自己對這兩門技術還未深入理解的情況下,不要冒險將業務系統搭建在這兩個漂亮的名詞上,建議使用MySQL之類的傳統資料庫
如果系統可以匹配Node.js的適用場景,那麼是時候採取具體的措施來說服老闆了。
說服自己老闆採用Node.js的方式
構建一個簡單的原型——花一周時間構建系統某一部分的原型是非常值得的,同時也很容易和老闆在某一點達成一致,等到系統真的在某一部分應用了Node.js,就是打開局面的時候
尋找開發者——首先JavaScript語言的普及度很高,一般公司都不乏Web前端工程師,而此類工程師的學習門檻也非常低。這就意味著Node.js很容易招人,或者公司就隱藏了一些高手
強大的社區支持——Node.js社區非常活躍,吸引很多優秀的工程師,這就意味著公司可以很容易從社區得到免費或者付費的支持
系統性能考慮——JavaScript引擎Google V8,加之原生非同步IO模型,使得Node.js在性能的表現非常出色,處理數以千計的並發請求非常輕松
⑨ 簡述非同步和多線程的區別及兩者的使用場景
非同步和多線程可以說沒有必然的聯系,只能說非同步可以通過多線程實現而已
要理解這些東西,你得具備很多相關的知識,操作系統原理,編譯原理等
簡單地來說,計算機或者說CPU執行你的代碼都是順序執行的,當前的語句沒有執行完,不會執行後面的語句的,這是永遠不變的規則!