2012-12-07 63 views
0

我有3種方法的NodeJS在一個函數中調用函數

exports.getImageById = function (resultFn, id) { 
... 
} 

exports.getCollectionById = function (resultFn, id) { 
} 
在第三種方法

我想這兩種方法調用

exports.getCollectionImages = function (resultFn, collectionId) { 

var arr = new Array(); 

this.getCollectionById( // fine, 1st call 
    function (result) { 
     var images = result.image; 
     for (i = 0; i < images.length; i++) { 
      this.getImageById(function (result1) { // error, 2nd call 
        arr[i] = result1; 
       }, images[i] 
      ); 

     } 
    } 
    , collectionId 
); 

resultFn(arr); 
} 

我可以先打電話功能this.getCollectionById,但它不能稱之爲this.getImageById ,它說未定義的功能,這是什麼原因?

回答

2

當你調用this.getCollectionById傳遞迴調,回調沒有訪問相同的this

最簡單的解決方法是this保存爲一個局部變量。

exports.getCollectionImages = function (resultFn, collectionId) {  
    var arr = new Array();   
    var me = this; // Save this 
    this.getCollectionById( // fine, 1st call 
     function (result) { 
      var images = result.image; 
      for (var i = 0; i < images.length; i++) { 
       // Use me instead of this 
       me.getImageById(function (result1) { // error, 2nd call 
        arr[i] = result1; 
       }, images[i]); 
      } 
     }, collectionId); 
    resultFn(arr); 
} 
+0

謝謝你爲這個,似乎JavaScript是純粹的實例取向的語言 –

+1

更準確的描述是,JavaScript中的方法不受限於一個實例,這取決於它們如何被調用。 –

+0

@sleimanjneidi是你的'getImageById'異步?如果是這樣,在'me.getImageById'回調中'i'的值將會出錯(循環中i的最後一個值) –

2

this內函數內的值是不相同的對象外,因爲它取決於函數是如何被調用來確定。您可以在MDN article on this中找到詳細的解釋。

一個解決這個問題的方法之一是通過在另一個變量如that保持到外this參考:

var that = this; 
this.getCollectionById( // fine, 1st call 
    function (result) { 
     var images = result.image; 
     for (i = 0; i < images.length; i++) { 
      that.getImageById(function (result1) { // 2nd call 
        arr[i] = result1; 
       }, images[i] 
      ); 

     } 
    } 
    , collectionId 
);