導航:首頁 > 編程語言 > javascript非同步編程的4種方法

javascript非同步編程的4種方法

發布時間:2024-06-24 18:00:02

1. javascript同步和非同步的區別與實現方式

javascript語言是單線程機制。所謂單線程就是按次序執行,執行完一個任務再執行下一個。

對於瀏覽器來說,也就是無法在渲染頁面的同時執行代碼。

單線程機制的優點在於實現起來較為簡單,運行環境相對簡單。缺點在於,如果中間有任務需要響應時間過長,經常會導致

頁面載入錯誤或者瀏覽器無響應的狀況。這就是所謂的「同步模式」,程序執行順序與任務排列順序一致。對於瀏覽器來說,

同步模式效率較低,耗時長的任務都應該使用非同步模式;而在伺服器端,非同步模式則是唯一的模式,如果採用同步模式個人認為

伺服器很快就會出現12306在高峰期的表現。。。。

非同步模式的四種方式:

1.回調函數callback

所謂回調函數,就是將函數作為參數傳到需要回調的函數內部再執行。

典型的例子就是發送ajax請求。例如:

$.ajax({

async: false,

cache: false,

dataType: 'json',

url: "url",

success: function(data) {

console.log('success');

},

error: function(data) {

console.log('error');

}

})

當發送ajax請求後,等待回應的過程不會堵塞程序運行,耗時的操作相當於延後執行。

回調函數的優點在於簡單,容易理解,但是可讀性較差,耦合度較高,不易於維護。

2.事件驅動

javascript可以稱之為是基於對象的語言,而基於對象的基本特徵就是事件驅動(Event-Driven)。

事件驅動,指的是由滑鼠和熱鍵的動作引發的一連串的程序操作。

例如,為頁面上的某個
$('#btn').onclick(function(){

console.log('click button');

});

綁定事件相當於在元素上進行監聽,是否執行注冊的事件代碼取決於事件是否發生。

優點在於容易理解,一個元素上可以綁定多個事件,有利於實現模塊化;但是缺點在於稱為事件驅動的模型後,流程不清晰。

3.發布/訂閱

發布訂閱模式(publish-subscribe pattern)又稱為觀察者模式(Observer pattern)。

該模式中,有兩類對象:觀察者和目標對象。目標對象中存在著一份觀察者的列表,當目標對象

的狀態發生改變時,主動通知觀察者,從而建立一種發布/訂閱的關系。

jquery有相關的插件,在這不是重點不細說了。。。。回頭寫個實現貼上來

4.promise模式

promise對象是CommonJS工作組提供的一種規范,用於非同步編程的統一介面。

promise對象通常實現一種then的方法,用來在注冊狀態發生改變時作為對應的回調函數。

promise模式在任何時刻都處於以下三種狀態之一:未完成(unfulfilled)、已完成(resolved)和拒絕(rejected)。以CommonJS
Promise/A
標准為例,promise對象上的then方法負責添加針對已完成和拒絕狀態下的處理函數。then方法會返回另一個promise對象,以便於形成promise管道,這種返回promise對象的方式能夠支持開發人員把非同步操作串聯起來,如then(resolvedHandler,
rejectedHandler); 。resolvedHandler
回調函數在promise對象進入完成狀態時會觸發,並傳遞結果;rejectedHandler函數會在拒絕狀態下調用。

Jquery在1.5的版本中引入了一個新的概念叫Deferred,就是CommonJS promise A標準的一種衍生。可以在jQuery中創建

$.Deferref的對象。同時也對發送ajax請求以及數據類型有了新的修改,參考JQuery API。

除了以上四種,javascript中還可以利用各種函數模擬非同步方式,更有詭異的諸如用同步調用非同步的case

只能用team里同事形容java和javascript的一句話作為結尾:

「寫java像在高速路上開車,寫javascript像在草原上開車」-------------以此來形容javascript這種無類型的語言有多自由
but,如果草原上都是坑。

2. 關於generator非同步編程的理解以及如何動手寫

關於generator非同步編程的理解以及如何動手寫一個co模塊

generator出現之前,想要實現對非同步隊列中任務的流程式控制制,大概有這么一下幾種方式:

3. 前端的Promise是幹啥的

Promise是非同步編程的一種解決方案,可以替代傳統的解決方案--回調函數和事件。ES6統一了用法,並原生提供了Promise對象。作為對象,Promise有以下兩個特點:

(1)對象的狀態不受外界影響。

(2)一旦狀態改變了就不會在變,也就是說任何時候Promise都只有一種狀態。

可以通過Promise的構造函數創建Promise對象。

varpromise=newPromise(function(resolve,reject)setTimeout(function(){
console.log("helloworld");},2000);
});

Promise構造函數接收一個函數作為參數,該函數的兩個參數是resolve,reject,它們由JavaScript引擎提供。其中resolve函數的作用是當Promise對象轉移到成功,調用resolve並將操作結果作為其參數傳遞出去;reject函數的作用是單Promise對象的狀態變為失敗時,將操作報出的錯誤作為其參數傳遞出去。如下面的代碼:

functiongreet(){varpromise=newPromise(function(resolve,reject){vargreet="helloworld";
resolve(greet);
});returnpromise;
}
greet().then(v=>{console.log(v);//*
})

上面的*行的輸出結果就是greet的值,也就是resolve()傳遞出來的參數。

注意:創建一個Promise對象會立即執行裡面的代碼,所以為了更好的控制代碼的運行時刻,可以將其包含在一個函數中,並將這個Promise作為函數的返回值。

Promise的then方法

  promise的then方法帶有以下三個參數:成功回調,失敗回調,前進回調,一般情況下只需要實現第一個,後面是可選的。Promise中最為重要的是狀態,通過then的狀態傳遞可以實現回調函數鏈式操作的實現。先執行以下代碼:

functiongreet(){varpromise=newPromise(function(resolve,reject){vargreet="helloworld";
resolve(greet);
});returnpromise;
}varp=greet().then(v=>{console.log(v);
})console.log(p);
閱讀全文

與javascript非同步編程的4種方法相關的資料

熱點內容
阿里雲伺服器登錄密碼忘了怎麼辦 瀏覽:495
linuxwwwdata 瀏覽:992
用蘋果終端java編譯 瀏覽:364
安卓怎麼拼接截屏 瀏覽:17
如何從安卓手機上修改wifi密碼 瀏覽:226
安卓12一加如何升級 瀏覽:86
冒險小虎隊pdf下載 瀏覽:542
程序員黑話今晚加班 瀏覽:930
androidgetmethod 瀏覽:798
編程輸出1112 瀏覽:792
加密貨幣礦怎麼樣 瀏覽:212
信息流優化師和程序員 瀏覽:101
pythonkivy框架 瀏覽:734
xshell怎樣返回上一條命令 瀏覽:489
python函數內存機制 瀏覽:829
手機國際網路伺服器地址 瀏覽:398
安卓系統投影儀怎麼連接外接設備 瀏覽:816
陰線向下接進20日均線選股源碼 瀏覽:433
穴點陣圖pdf 瀏覽:46
高頻量化演算法 瀏覽:909