Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/466.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用异步chrome.cookies.getAll的结果_Javascript_Asynchronous_Google Chrome Extension - Fatal编程技术网

Javascript 使用异步chrome.cookies.getAll的结果

Javascript 使用异步chrome.cookies.getAll的结果,javascript,asynchronous,google-chrome-extension,Javascript,Asynchronous,Google Chrome Extension,我遇到了一个异步JavaScript问题,无法将回调方法中接收到的值保存为对象文本。我正在制作一个Chrome扩展,并使用Chrome.cookies.getAll方法,能够获取cookies并在回调中读取它们,但我无法将值保存到对象。我仍然掌握着对象和异步JavaScript的窍门,需要一些帮助 这是密码 var app = { init: function() { this.activeCookie = { 'sid': null

我遇到了一个异步JavaScript问题,无法将回调方法中接收到的值保存为对象文本。我正在制作一个Chrome扩展,并使用
Chrome.cookies.getAll
方法,能够获取cookies并在回调中读取它们,但我无法将值保存到对象。我仍然掌握着对象和异步JavaScript的窍门,需要一些帮助

这是密码

var app = {
    init: function() {
        this.activeCookie = {
            'sid': null
        };
        this.setupSession();
        // shows null
        console.log('session in object : ');
        console.log(this.activeCookie['sid']);
    },

    setupSession: function() {
        var that = this;

        function setCookiesAsync(that, cookie) {
            console.log(cookie);
            for(var i=0; i<cookie.length; ++i) {
                if(cookie[i]['name'] === 'sid') {
                    that.activeCookie['sid'] = cookie[i]['value'];
                    // shows a token
                    console.log('session in callback : ');
                    console.log(that.activeCookie['sid']);
                }
            }
        }

        chrome.cookies.getAll({
            'url': ST.BaseUrl
        }, function (cookie) {
            setCookiesAsync(that, cookie);

        });
    }
};
this.activeCookie['sid']
null

我想知道如何将值保存到对象中,以便异步方法将其保存到对象中,并在
setupSession()
完成后执行后续的代码行。

当这个问题在a上时,它的措辞和范围足够好,因此提供特定的解决方案也会有所帮助

init()
的部分是异步执行的。这意味着当
init()
完成执行时,并非所有代码都已运行没有办法解决这个问题-异步部分之后的代码将在异步部分之前运行。

但是,如果您有一些代码要在
init
之后特别执行(例如,您的其他代码!),则可以通过将此代码作为回调传递并将其添加到适当的位置来执行:

init: function(callback) {
  this.activeCookie = {
    'sid': null
  };
  this.setupSession(callback);
},

setupSession: function(callback) {
  var that = this;

  function setCookiesAsync(that, cookie) {
    for(var i=0; i<cookie.length; ++i) {
      if(cookie[i]['name'] === 'sid') {
        that.activeCookie['sid'] = cookie[i]['value'];
      }
    }
    // This is the point where all of init() has finished
    if (typeof callback === "function") { callback(); }
  }

  chrome.cookies.getAll({
    'url': ST.BaseUrl
  }, function(cookie) {
    setCookiesAsync(that, cookie);
  });
}

或者,您可以使用


很抱歉用一个如此精心设计的问题(我也投了赞成票)来结束这篇文章,但这确实是一个常见的话题。是的,我知道我读了很多关于这个的文章,在这里看到了一些很棒的帖子,但仍然无法将值保存到对象。我能开着吗?我可以将其更改为保持打开状态吗?您的
init
函数本质上也是异步的,因为它的某些部分是异步的-为了确保代码在
init
应该执行的所有操作之后真正执行,它需要进行回调(或返回承诺),您可以保证在之后执行(即
setCookiesAsync
结束时)嗯,很奇怪,不过谢谢你。所以我需要更像这样的东西:var app={init:function(callback){this.activeCookie={'sid':null};this.setupSession();};但是我的回调函数会是什么样子,它会在对象内部还是外部?再次感谢您。您可能还想看看我最近关于为什么在Chrome中使用异步函数的文章。您比您出色,Xan非常有用。我仍在努力理解和使用promise实现,但回调实现现在已经非常有意义了。非常感谢。
init: function(callback) {
  this.activeCookie = {
    'sid': null
  };
  this.setupSession(callback);
},

setupSession: function(callback) {
  var that = this;

  function setCookiesAsync(that, cookie) {
    for(var i=0; i<cookie.length; ++i) {
      if(cookie[i]['name'] === 'sid') {
        that.activeCookie['sid'] = cookie[i]['value'];
      }
    }
    // This is the point where all of init() has finished
    if (typeof callback === "function") { callback(); }
  }

  chrome.cookies.getAll({
    'url': ST.BaseUrl
  }, function(cookie) {
    setCookiesAsync(that, cookie);
  });
}
app.init(function() {
  /* code that should execute after init */
});
init: function() {
  this.activeCookie = {
    'sid': null
  };
  return this.setupSession(callback); // returns a Promise
},

setupSession: function() {
  return new Promise(function(resolve, reject) {
    var that = this;

    function setCookiesAsync(that, cookie) {
      for(var i=0; i<cookie.length; ++i) {
        if(cookie[i]['name'] === 'sid') {
          that.activeCookie['sid'] = cookie[i]['value'];
        }
      }
      // This is the point where all of init() has finished
      resolve();
    }

    chrome.cookies.getAll({
      'url': ST.BaseUrl
    }, function (cookie) {
      setCookiesAsync(that, cookie);
    });
  });
}
app.init().then(function() {
  /* code that should execute after init */
});