摘要:我們可以在程序的運(yùn)行過程中根據(jù)檢測(cè)到的狀態(tài)來決定之后哪些回調(diào)函數(shù)會(huì)被執(zhí)行。
異步方式的概述
通過事件達(dá)到異步操作
通過我們最熟悉的回調(diào)
類promise的方式
首先我們注意到1.5版本前后的jquery有一個(gè)重要的不同
//before 1.5 var option={ type:"GET", url:"...", success:function(){..}, fail:function(){..}, complete:function(){..} }; $.ajax(option); //after 1.5 $.ajax(option) .done(function(){..}) .fail(function(){..}) .progress(function(){..}) .always(function(){..})
1.5版本之后變成了優(yōu)美的鏈?zhǔn)秸{(diào)用,并且可以對(duì)同一事件增加多個(gè)回調(diào)函數(shù),原因是原生的xhr對(duì)象換成了jqxhr對(duì)象,里面有什么魔法呢?
從promise講起promise在javascript編程世界里可以說是大名鼎鼎,下面這段代碼給出了它的簡(jiǎn)單用法。
promise(function(){..}). then([successhandler1,successhandler2,..], [failhandler1,failhandler2,...]);
promise為我們呈現(xiàn)出了異步編程的一種新模式,但它還不夠漂亮,接下來我們看一看jQuery引入的deferred。
jQuery的Deferred 創(chuàng)建Deferred對(duì)象var de=$.Deferred();//空的Deferred對(duì)象 $.Deferred(function(){..}). done(function(){..}); //會(huì)直接執(zhí)行里面的function并返回一個(gè)Deferred對(duì)象 function tmp(defer){ .... return defer; };//這個(gè)寫法的含義我們留在后面再講Deferred的機(jī)理
我們可以這樣想,每個(gè)deferred對(duì)象內(nèi)部有一個(gè)隱藏著的狀態(tài)變量,有成功、失敗、執(zhí)行中三種狀態(tài),當(dāng)程序執(zhí)行成功則會(huì)把它設(shè)為成功,否則設(shè)為失敗。這里的成功失敗指的是滿足某種設(shè)定條件,并非一般意義上的出錯(cuò),即使拋出異常也不認(rèn)為其失敗。我們可以在程序的運(yùn)行過程中根據(jù)檢測(cè)到的狀態(tài)來決定之后哪些回調(diào)函數(shù)會(huì)被執(zhí)行。
設(shè)定狀態(tài)實(shí)例
$(function(){ .... if(..) this.resolve(arg1,arg2,..); //會(huì)執(zhí)行done和always回調(diào),args是傳入回調(diào)的參數(shù) //同類函數(shù)this.resolveWith(content,[args..]);content作為回調(diào)函數(shù)中的this else this.reject(arg1,arg2,..); //執(zhí)行fail和always回調(diào),rejectWith基本同上 //需要注意的是always也必須狀態(tài)改變才能調(diào)用,若一直處于執(zhí)行狀態(tài),也不會(huì)調(diào)用 .... this.notify(args);//調(diào)用progress回調(diào),但必須在狀態(tài)變?yōu)槌晒蚴∏鞍l(fā)起,這里progress不會(huì)被調(diào)用 //notifyWith基本同上 }).fail(..).done(..).progress(..);
還需要注意的是,即使?fàn)顟B(tài)發(fā)生改變了,程序還會(huì)繼續(xù)運(yùn)行。這里所說的成功失敗指的是滿足我們?cè)O(shè)定的條件與否,和程序真的運(yùn)行狀態(tài)無關(guān),done、fail、always返回的依然是原本的deferred對(duì)象。
請(qǐng)記住無論什么回調(diào)都是在函數(shù)執(zhí)行完后調(diào)用,函數(shù)執(zhí)行不會(huì)被中斷
最后還要注意一點(diǎn)未防止?fàn)顟B(tài)在程序外部被更改,應(yīng)該加上一句
$.Deferred(function(){..}).promise().done(..).fail(..);
但promise返回的不再是原本的Deferred對(duì)象了,也不能在外部更改其狀態(tài)了。
看到這里我們可能有一個(gè)疑問,如果我們有一系列任務(wù)來決定后來的回調(diào)怎么辦,不用擔(dān)心我們有when。
$.when(defer1,defer2...); //這時(shí)候如果每個(gè)defer還要$(func(){..})就很難寫了,所以就回到我們開始介紹的最后一種,利用函數(shù)返回 var defer1=$.Deferred(); var defer2=$.Deferred(); function func1(defer){...return defer;} function func2(defer){...return defer;} $.when(func1(defer1),func2(defer2)).done(..).fail(..); //當(dāng)全部defer成功done才會(huì)被調(diào)用,有一個(gè)defer失敗fail就會(huì)調(diào)用,但無論怎樣一個(gè)回調(diào)函數(shù)最多被調(diào)用一次,且不會(huì)影響所有函數(shù)的執(zhí)行 var tmp=9; $.when(tmp).done(..).fail(..); //當(dāng)when鏈里面全部不是defer變量時(shí)會(huì)直接執(zhí)行done回調(diào),注意是全部,有defer變量會(huì)跳過非defer,回調(diào)取決于defer
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/85422.html
摘要:回調(diào)函數(shù)指定了下一步操作。異步操作的流程控制參數(shù)為秒后返回結(jié)果上面代碼的函數(shù)是一個(gè)異步任務(wù),非常耗時(shí),每次執(zhí)行需要秒才能完成,然后再調(diào)用回調(diào)函數(shù)。 單線程模型同步任務(wù)和異步任務(wù)任務(wù)隊(duì)列和事件循環(huán)異步操作的模式回調(diào)函數(shù)事件監(jiān)聽發(fā)布/訂閱異步操作的流程控制串行執(zhí)行并行執(zhí)行并行與串行的結(jié)合 1.單線程模型指的是js只在線程運(yùn)行,一個(gè)時(shí)間執(zhí)行一個(gè)任務(wù),其他任務(wù)排隊(duì)。事實(shí)上是一個(gè)運(yùn)行腳本的主線程...
摘要:在服務(wù)器端,異步模式甚至是唯一的模式,因?yàn)閳?zhí)行環(huán)境是單線程的,如果允許同步執(zhí)行所有請(qǐng)求,服務(wù)器性能會(huì)急劇下降,很快就會(huì)失去響應(yīng)。第三是,捕捉不到他的錯(cuò)誤異步編程方法回調(diào)函數(shù)這是異步編程最基本的方法。 前言 你可能知道,Javascript語言的執(zhí)行環(huán)境是單線程(single thread)。所謂單線程,就是指一次只能完成一件任務(wù)。如果有多個(gè)任務(wù),就必須排隊(duì),前面一個(gè)任務(wù)完成,再執(zhí)行后面...
摘要:異步與同步技術(shù)研究概念介紹異步簡(jiǎn)寫同步簡(jiǎn)寫用比方來比喻異步就是個(gè)人同時(shí)起跑起點(diǎn)和出發(fā)時(shí)間相同在起跑時(shí)不去關(guān)心其他人會(huì)啥時(shí)候跑完尼瑪這不廢話嗎大家都才起跑怎么知道別人多就跑完同步就是個(gè)人接力跑起點(diǎn)和出發(fā)時(shí)間不同且后一個(gè)人會(huì)等待前一個(gè)人跑完才能 1. 異步與同步 技術(shù)研究 (1). 概念介紹 異步: asynchronous 簡(jiǎn)寫async 同步: synchronous 簡(jiǎn)寫syn...
摘要:在異步機(jī)制中,任務(wù)隊(duì)列就是用來維護(hù)異步任務(wù)回調(diào)函數(shù)的隊(duì)列。四對(duì)象對(duì)象是工作組提出的一種規(guī)范,目的是為異步編程提供統(tǒng)一接口。 異步 1.JavaScript單線程的理解 Javascript語言的執(zhí)行環(huán)境是單線程(single thread)。所謂單線程,就是指一次只能完成一件任務(wù)。如果有多個(gè)任務(wù),就必須排隊(duì),前面一個(gè)任務(wù)完成,再執(zhí)行后面一個(gè)任務(wù),以此類推。 2.JavaScript單線...
摘要:應(yīng)用日益復(fù)雜,模塊化已經(jīng)成為一個(gè)迫切需求。異步模塊加載機(jī)制。引用的資源列表太長(zhǎng),懶得回調(diào)函數(shù)中寫一一對(duì)應(yīng)的相關(guān)參數(shù)假定這里引用的資源有數(shù)十個(gè),回調(diào)函數(shù)的參數(shù)必定非常多這就是傳說中的 簡(jiǎn)述 緣起 模塊通常是指編程語言所提供的代碼組織機(jī)制,利用此機(jī)制可將程序拆解為獨(dú)立且通用的代碼單元。 模塊化主要是解決代碼分割、作用域隔離、模塊之間的依賴管理以及發(fā)布到生產(chǎn)環(huán)境時(shí)的自動(dòng)化打包與處理等多個(gè)方面...
閱讀 1638·2021-11-19 11:38
閱讀 3634·2021-11-15 11:37
閱讀 872·2021-09-30 09:48
閱讀 1101·2021-09-29 09:46
閱讀 967·2021-09-23 11:22
閱讀 1948·2019-08-30 15:44
閱讀 3474·2019-08-26 13:58
閱讀 2437·2019-08-26 13:26