Javascript 回调返回chromeapi中未定义的

Javascript 回调返回chromeapi中未定义的,javascript,google-chrome,google-chrome-extension,Javascript,Google Chrome,Google Chrome Extension,以前有人问过许多类似的问题,但我确信这是不同的。请通读全文以了解情况 我知道ChromeAPI是异步的 所以,我现在做的是为一些网站获取cookie,比如: var myUrl = ["mywebsite.com","mywebsite2.com","mywebsite3.com","mywebsite4.com"]; var outLine = {}; var aE; for (var i

以前有人问过许多类似的问题,但我确信这是不同的。请通读全文以了解情况

我知道ChromeAPI是异步的

所以,我现在做的是为一些网站获取cookie,比如:

var myUrl = ["mywebsite.com","mywebsite2.com","mywebsite3.com","mywebsite4.com"]; 
    var outLine = {};
    var aE;
    for (var i = 0; i < myUrl.length ; i++) {   
        outLine[myUrl[i]] = {};
        chrome.cookies.getAll({domain: myUrl[i]}, function(cookie) {
            var templar = {};
            var str = cookie[0]['domain'];
            var domain = str.split('.');
            var length = domain.length;
            var url = domain[length-2]+"."+domain[length-1];
            var cLength = cookie.length;
            console.log(cLength);
            for(var j=0; j < cLength; j++){
                templar[j] = JSON.stringify(cookie[i]);
            }
            outLine[url]=JSON.stringify(templar);


            // This should have been outside the loop but 
            // as it is asynchronous so I put it inside so eventually it 
            // will have all the cookies as desired
            // actually this was the first problem
            aE = JSON.stringify(outLine);
        });
    }

    chrome.storage.local.get('uid', function(id){
       // Here I want to use the variable aE
       //But am unable to do so due to asynchronous
       // So, it was all good when there wasn't any loop, only one
       // chrome API , but here the next chrome API call is dependent
       // on previous' value.
    });
var myUrl=[“mywebsite.com”、“mywebsite2.com”、“mywebsite3.com”、“mywebsite4.com”];
var大纲={};
变种aE;
对于(var i=0;i
所以,到现在为止,你应该已经明白问题是什么了。 变量aE未定义

我想要一个简单的实现,正确地解决这个问题。

谢谢 根据trincot的建议,我做了如下更改:
。。。
outLine[url]=JSON.stringify(templar);
aE=JSON.stringify(大纲);
log(“内部启动:迭代#”+i);
if(i==myUrl.length){
控制台日志(“完整aE:+aE”);
发送数据(aE);
}
......
函数发送数据(aE){
控制台日志(“内部发送数据”+aE);
......
输出

Inside Startup : iteration #4
Complete aE : <...aE...>
Inside sendData<....aE...>
Inside Startup : iteration #4
Complete aE : <...aE...>
Inside sendData<....aE...>
Inside Startup : iteration #4
Complete aE : <...aE...>
Inside sendData<....aE...>
Inside Startup : iteration #4
Complete aE : <...aE...>
Inside sendData<....aE...>
内部启动:迭代#4
完全不良事件:
内部发送数据
内部启动:迭代#4
完全不良事件:
内部发送数据
内部启动:迭代#4
完全不良事件:
内部发送数据
内部启动:迭代#4
完全不良事件:
内部发送数据
所以这张照片打印了4次

现在这就是问题所在,它应该只打印一次,但打印了4次

解决方案 正如trincot所建议的(它起作用了,谢谢你):

只需将var更改为let(因为var具有整个功能的范围,而不管块范围,但让局限于块范围
for(让i=0;i
chrome.*API是异步的,异步js就是这样工作的。将依赖代码放在getAll回调中。或者对getAll使用Promise.all和Promise包装器,并在
中使用
aE
。然后()
我已经阅读了所有内容,这只是关于异步与同步代码的其中一个问题:您不能期望在同步代码中得到异步结果。@wOxxOm所有代码都不能放入其中,因为我必须在获取所有URL的cookie后才保存它。@trincot我确实理解这一点,那么我如何确保所有数据已提取?因此,请在回拨中使用
if
,当所有操作完成时,该回拨将具有真实条件,并将所有依赖代码放入
if
块中。对于该条件,您只需使用外部作用域中定义的计数器。在每次回拨执行时递增它,当它等于myUrl.length时,您就知道了你什么都有。
Inside Startup : iteration #4
Complete aE : <...aE...>
Inside sendData<....aE...>
Inside Startup : iteration #4
Complete aE : <...aE...>
Inside sendData<....aE...>
Inside Startup : iteration #4
Complete aE : <...aE...>
Inside sendData<....aE...>
Inside Startup : iteration #4
Complete aE : <...aE...>
Inside sendData<....aE...>
for (let i = 0; i < myUrl.length ; i++) {   
        outLine[myUrl[i]] = {};
        chrome.cookies.getAll({domain: myUrl[i]}, function(cookie) {
            var templar = {};