javascript - Foreach 在 foreach 中,结果为空,可能是因为异步调用

标签 javascript asynchronous google-chrome-extension q async.js

变量ntabs最后是空的,我如何更改此代码(可能使用Q或异步库)以使其正常工作

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

最佳答案

函数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);
}

关于javascript - Foreach 在 foreach 中,结果为空,可能是因为异步调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40696350/

相关文章:

c# - 从 C# get set 属性调用的异步方法

ajax调用的成功函数中未设置javascript类属性

python - 简单的 Python 异步。预编译器?

google-chrome-extension - 为什么这个声明性的网络请求规则不起作用?

javascript - 找到一个图像名称并将其替换为不同的来源

google-chrome - 以编程方式更改 Chrome 扩展更新频率

javascript - 如何让 td 点击有 tr

javascript - parent 不在 jQuery 工作

javascript - 如何缩小 gulp-webpack 文件?

javascript - 如何使用 Service Worker 存储用户 ID