亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

讀jquery技術內幕(jquery1.7版本)遇到的問題

讀jquery技術內幕(jquery1.7版本)遇到的問題

元芳怎么了 2019-05-22 21:26:18
functionfn1(args){console.log('fn1',args);}functionfn2(args){console.log('fn2',args);}vardefer=$.Deferred(),filtered=defer.pipe(function(value){returnvalue*2;});defer.done(fn1);filtered.done(fn2);defer.resolve(5);/*輸出fn210fn15*/為什么是先執行fn2再執行fn1?
查看完整描述

2 回答

?
瀟瀟雨雨

TA貢獻1833條經驗 獲得超4個贊

在執行filtered=defer.pipe(function(value){returnvalue*2;});的時候,會返回$.Deferred(fn).promise();$.Deferred(fn)中的fn會在$.Deferred()結束之前執行,pipe方法中的$.Deferred(fn)的fn會執行deferred.done(匿名函數。。。),這個匿名函數負責執行pipe方法返回的新的異步隊列,要先于defer.done(fn1);所以先執行匿名函數匿名函數執行fn2,最后執行fn1。表達能力不是很好,所以說的不是很清楚orz。。。
                            
查看完整回答
反對 回復 2019-05-22
?
互換的青春

TA貢獻1797條經驗 獲得超6個贊

感覺說的有點亂,其實總結就是,在defer.resolve(5)之前,并沒有任何函數被執行,它們只是在定義什么時候干什么事,如果你能理解這一點,下邊這些你應該就不會覺得亂了。
我沒有怎么學習過jQuery,但是看這個API,應該是這樣的:
filtered=defer.pipe(v=>v*2)這里為defer定義了一個流水線任務(即pipe,這個東西有很多翻譯,我習慣理解成流水線,pipe多數情況下是允許你不停疊加任務的);
defer.done(fn1)是為defer定義了:當前邊pipe里所有的任務都執行完后,執行fn1。
filtered.done(fn2)是說filtered本身執行完后執行fn2。
defer.resolve(5)從此時開始,表明對defer(和defer上定義的一系列pipe任務)已經定義完成,開始執行。
所以你可以看到輸出時是這樣的:
defer.resolve(5)
//開始執行defer
//因為前邊定義了filtered=derfer.pipe(v=>v*2),所以要先把流水線上的任務執行完
//也就是說filtered會拿到一個10作為參數
//filtered.done就是通知你filtered本身的事情做完了,相當于一個事件回調。
fn2(10)//這個10就是defer.pipe里那個函數的結果
//filtered全部事情都完成了,現在就繼續回到defer的任務上
//defer的任務除了filtered就沒了,那么就執行defer.done
//而v=>v*2是filtered時所執行的操作,所以此時defer手上的不是10而仍然是5
fn1(5)
                            
查看完整回答
反對 回復 2019-05-22
  • 2 回答
  • 0 關注
  • 401 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號