2016-12-24 35 views
0

異步for循環這裏是我的名單[]科爾多瓦resolvaLocalFileSystemUrl()不能在

$scope.getCategory = function(){ 
var newList = []; 
var list = [ 
{ 
    Category: 'Souenir', 
    Image: 'http://domain.com/souvenir.jpg' 
}, 
{ 
    Category: 'specialsouvenir', 
    Image: 'http://domain.com/specialsouvenir.jpg' 
}, 
{ 
    Category: 'flower', 
    Image: 'http://domain.com/flower.jpg' 
}, 
{ 
    Category: 'Toy', 
    Image: 'http://domain.com/toy.jpg' 
}]; 

for(var i = 0;i < list.length;i++){ 
     var item = list[i]; 
     var category = ''; 
     var image = ''; 
     var imageName = item.Image.split("/").pop(); 
     var path = ''; 
     path = 'cdvfile://localhost/persistent/'; 
     window.resolveLocalFileSystemURL(path+imageName, function(entry) { 
      image = entry.toURL(); 
      newList.push({Category:item.Category,Image:image}); 
     }); 
    } 

    return newList; 
} 

結果顯示:

4項[正確]爲每個項目

圖像[正確]

但類別顯示最後一個循環項目,而不是每4項[錯誤] enter image description here 這裏是爲iPad

回答

1

截圖它是一個典型的JS陷阱。由於您將項目推送到newListwindow.resolveLocalFileSystemURL回叫(異步回叫),因此只能訪問同步的for循環中的最後一項。

所以JS事件循環會是這個樣子: 1> 2> 3> 4> 1個回調> 2回調> 3回調> 4回調

有一個偉大的video解釋它。

爲了解決您的問題併爲每個項目設置一個唯一的類別,您應該在自稱函數中包裝異步操作。這裏是jsfiddle的解釋。

+0

感謝您的回覆先生,我有點知道它現在如何工作,但有沒有辦法讓它在手術後返回列表? –

+0

cos此返回方法似乎在push()之前返回null getCategory:function(){for(){} return list; }' –

0

感謝@antonama回答!

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

    (function (i) { 
      var item = CategoryList[i]; 
      var image = ''; 
      var imageName = CategoryList[i].Image.split("/").pop(); 
      var path = ''; 
      path = 'cdvfile://localhost/persistent/'; 
      window.resolveLocalFileSystemURL(path+imageName, function(entry) { 
      image = entry.toURL(); 
      list.push({Category:item.Category,Image:image}); 
     }); 
     })(i); 
} 

在異步操作之後,我添加了一個setTimeout()來刷新並返回列表,否則列表返回將爲空。

setTimeout(function(){ 
    list = list; 
}); 
return list; 

然後完成!