作者kewang (652公車)
看板Ajax
標題[問題] 關於Closure、callback及IIFE的問題
時間Sun Sep 1 23:24:32 2013
01 var a = "";
02
03 arrFoo.forEach(function(bar){
04 var res = (function(){
05 asyncFunction(function(response){
06 return response;
07 });
08 })();
09
10 a += response;
11 });
12
13 alert(a);
今天一整天都在研究Closure跟IIFE之間的關係,結果還是沒有成功。
以上述的code為例,我想要把asyncFunction回傳的res全部都併在a裡面,
可是無論我有沒有加L4跟L8,最後在L13的alert卻仍然為空白(就是L1的預設值"")
請問有朋友知道這該如何處理嗎?(明天到公司繼續啃相關文件)
--
雜七雜八的kewang部落格
http://kewang.tw
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 220.134.3.53
※ 編輯: kewang 來自: 220.134.3.53 (09/01 23:24)
1F:推 s25g5d4:你完全理解錯誤... 09/01 23:25
2F:→ s25g5d4:asyncFunction 的 callback 裡改成 a += response 09/01 23:26
3F:→ s25g5d4:另外就是這個response會沒有順序 因為你不能控制非同步 09/01 23:27
4F:→ s25g5d4:函數執行的順序 09/01 23:27
5F:→ s25g5d4: ^完畢 09/01 23:27
6F:→ kewang:我一開始就是照樓上的這樣寫,不過L13依舊為空白 09/01 23:40
01 var a = "";
02
03 arrFoo.forEach(function(bar){
04 (function(){
05 asyncFunction(function(response){
06 a += response;
07 });
08 })();
09 });
10
11 alert(a);
一開始的寫法是這個樣子,結果L11一樣是顯示為空白 Orz
※ 編輯: kewang 來自: 220.134.3.53 (09/01 23:49)
7F:推 s25g5d4:asyncFunction還沒全部跑完阿...加一個 i 當asyncFunction 09/01 23:50
8F:→ s25g5d4:呼叫 callback 的時候 i+1 等到 i === arrFoo.length 09/01 23:50
9F:→ s25g5d4:再 alert(a) 09/01 23:50
10F:推 davidsky:如上所說L13執行時沒辦法保證asyncFunction已經執行 09/02 01:49
13F:→ davidsky:處理非同步回呼建議用jquery defer 09/02 02:02
15F:→ kewang:感謝樓上,我晚上再來試看看 09/02 13:10
16F:→ kewang:我試過了確實可行,但原本的需求是L11後面還有一大堆要處理 09/02 21:55
17F:→ kewang:的事情,現在看起來就是傳一個function到裡面去做了 09/02 21:55
18F:推 StephenCurry:如果要這樣寫, 那alert(a)之前最好加一下保護機制 09/02 21:58
19F:→ StephenCurry:不然很容易遇到傳入的變數不是預期的格式 09/02 21:58