我不知道为什么但它不起作用
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));
我得到了正确的结果?为什么它在执行第二个命令时起作用而不是一开始?
答案 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);
现在,这是尊重程序的异步行为。