0

переменной ntabs в конце концов пуста, как я могу изменить этот код (возможно, с помощью Q, или асинхронного LIBS), чтобы сделать его работать правильноForeach внутри Еогеасп, результат пуст, вероятно, из-за асинхронный вызов

var actions = [..];//array of objects 
var ntabs = [];//arr where i put results 

    actions.forEach(function(a) { 
    chrome.tabs.query({url: a.url}, function(tabs) { 
     tabs.forEach(function(tab) { 
      var t = { 
      id: tab.id, 
      title: tab.title, 
      url: tab.url, 
      faviconUrl: tab.favIconUrl, 
      actions: a.actions 
      } 
      ntabs.push(t); 
     }); 
    }); 
    }); 

    console.log(ntabs);//result is empty 

ответ

1

Функция chrome.tabs.query - это асинхронная функция. Вы должны добавить счетчик, который будет выполнять остальную часть кода, когда последний запрос будет завершен.

var actions = [{ 
    url: 'http://stackoverflow.com/questions/40696350/foreach-inside-foreach-result-is-empty-probably-because-of-async-call' 
}, { 
    url: 'chrome://extensions/?id=ehlnpfcjcalccnjondlokficpbkiefdk' 
}]; 
var n = actions.length; 
var ntabs = []; 
actions.forEach(function(a) { 
    chrome.tabs.query({ 
    url: a.url 
    }, function(tabs) { 
    tabs.forEach(function(tab) { 
     var t = { 
     id: tab.id, 
     title: tab.title, 
     url: tab.url, 
     faviconUrl: tab.favIconUrl, 
     actions: a.actions 
     } 
     ntabs.push(t); 
    }); 
    if(--n === 0) onQuery(); 
    }); 
}); 

function onQuery() { 
    console.log(ntabs); 
} 
+0

это работает, спасибо! – teMkaa

+1

Хотя 'chrome.tabs.query' является асинхронным, он не возвращает [Promise] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise), и вы не рассматривая, как если бы это было так. – Makyen

+0

@Makyen. Да исправить. Я забыл, что функция 'query' только для Firefox возвращает обещание. –

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

  • Нет связанных вопросов^_^