无法通过扩展获得cookie

时间:2016-03-17 15:29:54

标签: google-chrome google-chrome-extension

我不知道为什么但它不起作用

function cookielist(){
var cookies={};
    chrome.cookies.getAll({},function (cookie){
        for(i=0;i<cookie.length;i++){
        if(!cookie[i].domain.startsWith('.')){cookie[i].domain='.'+cookie[i].domain;}
        cookies[cookie[i].domain]?'':cookies[cookie[i].domain]=[];
        cookies[cookie[i].domain].push(JSON.stringify(cookie[i]));
        }
    });
return cookies;
}
test=cookielist();console.log(JSON.stringify(test));

我从控制台运行它(我从manifest.json有足够的烫发没问题)

它让我回头

" {}
undefined"

只是{}空对象

但是当我跑步时

test=cookielist();

当我运行

时从控制台发出此命令
console.log(JSON.stringify(test));

我得到了正确的结果?为什么它在执行第二个命令时起作用而不是一开始?

1 个答案:

答案 0 :(得分:2)

这是因为cookie.getAll是异步功能。实际上,您必须将回调函数声明为第二个参数。回调在getAll返回后执行,这不会考虑代码流。因此,当您返回cookie时,尚未计算该值。这就是它返回undefined的原因。

您必须尊重自然语言行为:如果要使用回调中计算的值,则必须在回调中编写代码。如果你想分离程序,你可以在回调中调用一个函数,但你不能期望在它之外得到一个值。

请查看canonical question for JavaScript asynchronicity以获得更好的解释。

因此,您应该为您的程序编写类似的内容:

function printIt(element) {
  console.log(JSON.stringify(element));
}

function cookielist(callback){
    var cookies={};
    chrome.cookies.getAll({},function (cookie){
        for(i=0;i<cookie.length;i++){
           if(!cookie[i].domain.startsWith('.')){
              cookie[i].domain='.'+cookie[i].domain;
           }
           cookies[cookie[i].domain]?'':cookies[cookie[i].domain]=[];
           cookies[cookie[i].domain].push(JSON.stringify(cookie[i]));
        }

        callback(cookies); 
    });
}

cookielist(printIt);

现在,这是尊重程序的异步行为。