Javascript 使用异步chrome.cookies.getAll的结果
我遇到了一个异步JavaScript问题,无法将回调方法中接收到的值保存为对象文本。我正在制作一个Chrome扩展,并使用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
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 */
});