【问题标题】:Foreach inside foreach, result is empty probably because of async call [duplicate]Foreach 在 foreach 中,结果可能是因为异步调用而为空 [重复]
【发布时间】:2016-11-20 02:43:06
【问题描述】:

变量 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

【问题讨论】:

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


    【解决方案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);
    }
    

    【讨论】:

    • 成功了,谢谢!
    • 虽然 chrome.tabs.query 是异步的,但它不会返回 Promise 并且您不会像对待它一样对待。
    • @Makyen。是,对的。我忘了只有 Firefox 的 query 函数会返回一个 promise。
    • @SoftwareEngineer171,当用作browser.tabs.query()时,它确实返回一个Promise,但当用作chrome.tabs.query()时,它不会返回一个Promise。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-22
    • 2018-02-01
    • 2023-04-04
    • 1970-01-01
    • 2014-10-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多