1

我一直在試着理解Javascript關閉,並認爲我正在進行一些操作。我已經成功地在我的內部函數中返回一個迭代整數(由for循環生成)。當函數需要回調值時,Javascript會關閉

但是,這個有問題的函數也需要函數本身生成的參數。原諒我的術語 - 但它可能是一個callaback參數(基本上,參數的值是基於我發出的函數返回的)。

下面有我的問題的更多的解釋,但首先,這裏是有問題的代碼(與關閉工作 - [值]是我的每次迭代變化的值):

FB.api('/me/tagged?limit=100', function(response) { 

for (var i=0; i<response.data.length; i++){ 

    var taggedId = response.data[i].id; 
    var fromId = response.data[i].from.id; 
    var fromName = response.data[i].from.name; 

    var taggedQuery = new Parse.Query('tagged'); 
    taggedQuery.equalTo('taggedId',taggedId); 
    taggedQuery.first({ //.first returns the first match (.find returns all) 
     success: (function(value) { 
      return function() { 
      console.log(response.data[value]); 
      } 
     })(i), 
     error: function(taggedRecError){ 
      console.log('error: '+taggedRecError.message); 
     } 
    }); 
} //for 
}); 

所以基本上,在上面,我查詢Facebook來獲取用戶的標記帖子。我使用for循環遍歷每個結果。

然後我使用Parse.js來查詢是否有爲此標記對象保存的記錄。

我希望我的代碼能夠識別我是否(有保存的對象)。在解析我通常會做到這一點使用類似以下內容:

taggedQuery.first({ //.first returns the first match (.find returns all) 
     success: function(value) { 
       if(value){ 
        //do nothing 
       } 
       else { 
        //do something - e.g. save to Parse data store 
       } 

     } 
}); 

所以,你可以看到,我才能決定下一步做什麼使用返回paramater(價值)的存在。

但是,在第一個代碼塊中,您可以看到爲了使閉包工作,我必須將參數('(i)')直接傳遞到成功函數中,以便獲得適當的i值用於該功能。然而,這然後扭曲我們從Parse得到的結果 - 即返回的對象來自我傳遞參數 - 不是從分析返回基於我的數據存儲的一個

我似乎在捕獲22:通過參數手動獲取成功的關閉(但是然後從Parse調用中丟失返回的參數),或者傳入無參數以確保Parse基於我的數據存儲返回正確的響應(但是在所述函數中具有錯誤的i值:即 - 沒有關閉)。

我希望這很清楚。如果沒有,請讓我知道。任何幫助讚賞。

+0

你可以同時使用。另見http://stackoverflow.com/q/750486/1048572 – Bergi 2012-07-23 18:53:36

回答

0

你在正確的軌道上,這就是我想你想你的success參數來完成:

taggedQuery.first({ //.first returns the first match (.find returns all) 
    success: (function(index) { 
     return function(value) { 
      //value is what Parse passes 
      //index is your preserved index 
     }; 
    }(i)) 
}); 
+0

非常感謝。我剛剛測試過這個(除了Esailija的解決方案),它的工作原理。再次感謝您的幫助。 – 2012-07-31 10:15:05

2

你可以使用[].forEach簡化了很多:

FB.api('/me/tagged?limit=100', function(response) { 
    response.data.forEach(function(value, i) { 
     var taggedId = value.id; 
     var fromId = value.from.id; 
     var fromName = value.from.name; 
     var taggedQuery = new Parse.Query('tagged'); 
     taggedQuery.equalTo('taggedId', taggedId); 
     taggedQuery.first({ 
      success: function(someOtherData) { 
       console.log(value, i, someOtherData); 
      }, 
      error: function(taggedRecError) { 
       console.log('error: ' + taggedRecError.message); 
      } 
     }); 
    }); 
}); 
+0

IE 8說他不喜歡'forEach'。 – 2012-07-23 18:54:45

+0

即使在IE7中也能正常工作...然後我再次閱讀我發佈的鏈接 – Esailija 2012-07-23 18:55:17

+2

IE不支持forEach直到第9版。這仍然是組合w/a shimming庫以保證兼容性時的理想解決方案。 – 2012-07-23 19:01:06

相關問題