Chrome扩展回调函数和并发

时间:2014-09-04 18:11:49

标签: javascript google-chrome google-chrome-extension concurrency

我正在学习Chrome扩展程序的编码,我对将参数传递给异步函数以及可能的并发问题感到好奇。让我举个例子:

function updateActiveTab(param1)
{
    chrome.tabs.query({active: true, currentWindow: true}, function(tabs)
    {
        onUpdatingTab(tabs[0].id, param1);
    });
}

function onUpdatingTab(tabID, param1)
{
    console.log("Tag ID=" + tabID + ", param=" + param1);
}

因此,我们假设第一次使用updateActiveTab()调用param1=1方法,并且对chrome.tabs.query()的调用需要一段时间。在此期间,虽然仍在处理chrome.tabs.query(),但我的updateActiveTab()方法会再次使用param1=2进行调用。当第一次调用chrome.tabs.query()返回并开始处理其回调函数时会发生什么? param11还是2

我显然希望将param1作为1和2传递给其功能的相应电话。

1 个答案:

答案 0 :(得分:1)

简短的回答是你会获胜。阅读JavaScript闭包,真正了解这里发生了什么。我会点击亮点,让你明白这一点。

对onUpdatingTab内部的param1的引用强制param1进入闭包。只要调用内部函数需要,闭包就会使param1的值保持活动状态。您描述的场景将创建两个不同的闭包,每次调用onUpdatingTab。

以下是一个改编自JavaScript的示例:Good Parts,它说明了闭包的这个方面。此函数接受一组DOM节点,并添加一个显示节点序号的onclick处理程序:

function add_the_handlers = function (nodes) {
    var helper = function(i) {
        return function(e) { alert(i); };
    };
    var i;
    for (i = 0; i < nodes.length; i += 1) {
        nodes[i].onclick = helper(i);
    }
}

每次调用helper都会返回一个函数,其中引用了&#34; i&#34;绑定为该帮助程序调用的闭包。请注意与不使用帮助程序的代码的语义区别,但只是这样做:

        nodes[i].onclick = function() { alert(i); }

在这里&#34;我&#34;再次绑定到一个闭包,但它是与add_the_handlers调用相关的闭包,因此单击每个节点会显示相同的值,即不是序数的节点数。这是分配给&#34; i&#34;。

的最后一个值