2011-04-05 2 views
1

Я, имеющие проблемы с доступом узлов [I] из функции обратного вызова внутри chrome.bookmarks.create. Есть идеи, ребята? Я думаю, что это из-за закрытия. Любой способ заставить его работать?доступа к внешним данным внутри функций обратного вызова

function copyBookmarks(nodes,folderId){    

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

     var properties={ 
      parentId:folderId, 
      index:nodes[i].index, 
      title:nodes[i].title, 
      url:nodes[i].url 
     }; 

     chrome.bookmarks.create(properties,function(newNode){    

      console.log(nodes[i]);//this doesnt work 

     });      
    } 
} 

ответ

3

Он обращается к nodes просто отлично, но проблема заключается в том, что i будет значение после того, как цикл завершается. Обычное решение, чтобы сделать копию i в каждой итерации с помощью самостоятельного выполнения функции:

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

    // Other code... 

    // Self executing function to copy i as a local argument 
    (function (i) { 
     chrome.bookmarks.create(properties, function (newNode) { 
      console.log(nodes[i]); 
     }); 
    })(i); 
} 
+1

Точно так же вы можете передать узел: '(функция (узел) {...}) (узлы [я]) ' –

+0

@Denis на самом деле, это даже лучше, если порядок массива' nodes' изменяется. –

+0

Зачем использовать (i) в конце? – anp

Смежные вопросы