- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我遇到了一个异步 JavaScript 问题,无法将回调方法中收到的值保存为对象文字。我正在制作一个 Chrome 扩展程序并使用 chrome.cookies.getAll
方法,并且能够获取 cookie 并在回调中读取它们,但我无法将值保存到对象中。我仍然掌握着对象和异步 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);
});
}
};
因为回调在之后执行
console.log('session in object : ');
console.log(this.activeCookie['sid']);
this.activeCookie['sid']
为 null
。
我想知道如何将值保存到对象,以便异步方法将它保存到对象,并在 setupSession()
完成后执行后续代码行。
最佳答案
虽然这个问题在 very canonical topic 上,它的措辞和范围都足够好,因此提供特定的解决方案也会有所帮助。
部分 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);
});
}
那么你可以使用如下代码:
app.init(function() {
/* code that should execute after init */
});
或者,您可以使用 Promises .
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 */
});
关于javascript - 使用异步 chrome.cookies.getAll 的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38508642/
我将 Angular 更新到版本 1.6.4。所以我必须将 .success 和 .error 更新为 .then 现在我收到以下错误: TypeError: .getAll(...).then is
对于像这样的简单域类: class Color { String name; } 为什么getAll()不起作用? @TestFor(MyColorService) @TestMixin(Do
我正在尝试使用泛型修改我的代码以避免所有重复的代码。 我有一个 DBBaseClass 类,它将由其他一些类扩展。我正在尝试创建一个 getAll 方法,该方法返回存储在数据库中的子类的所有对象。
我得到 RqlRuntimeError: Expected type TABLE_SLICE but found SELECTION: 链接 getAll 和 between 方法时出现错误。 r.d
我正在尝试将服务 worker 实现到我的应用程序中,我已经在 Chrome、Firefox 和 Safari 中成功做到了这一点,但在 IE 中还没有完全做到。到目前为止,我能够创建一个对象存储并向
亲爱的, 我只是想知道是否可以创建一个以 SQL 查询作为参数并继续处理请求的函数。考虑两个函数: async addExpense(req, res){ const addExpense =
我试图更新数据库上的一行,并注意到一旦更新了该行,getAll就会停止正常工作。所有已更新的记录开始从getAll的结果中丢失。 例如,假设您有一个产品列表[product1,product2,pro
这是使用 Xodus API 限制实体查询的方法: final EntityIterable allUsers = txn.getAll(storeName).skip(skip).take(limi
我想做一个项目来学习Java ee。我计划建立一个票务管理系统。所以我创建了一个 mysql 数据库、实体类、访问类、ejb 类,最后是 WService 类。对于单个 Seat 和 Customer
我正在做一个 java 应用程序。 到目前为止,这是我的文件: 人机界面。 有一个 setName(String aName) 方法 PersonImpl 人机界面的实现。 个人工厂接口(interf
IDBObjectStore有一个方法 getAll() . 但是,TypeScript 报告没有这样的方法。 lib.d.ts 中的相关部分是: interface IDBObjectStore {
我正在尝试使用 ngrx-data-lab作为我的项目的示例。 这是 stackblitz我使用的项目。 我不能使用我正在使用的服务器的实际 url。该网址属于我的公司。但实际情况是服务器将随机生成的
使用带有 4 个 Analytics 标记的 Google 跟踪代码管理器:3 个标记在“页面查看”上触发,而 1 个标记在“JavaScript 错误”上触发。 标签本身工作正常:如果 uncaug
在数据访问层中使用如下方法很常见: Tuple> GetAllWithFilter(int? page, string folderName, string title, string fil
我正在开发一个简单的 chrome 扩展程序,只需单击一下即可删除域中的所有 cookie,但由于某种原因,它无法正常工作。当我尝试从域中获取所有 cookie 时,它返回一个空数组。我究竟做错了
Angular 4 使用 get 和 getAll 方法添加了对 paramMap 的支持: 我能理解这段产生“id”值的代码 route.paramMap.subscribe( param
我在 Java 中使用 Ignite v2。下面是我的点燃节点配置。 CacheConfiguration cacheCfg = new CacheConfiguration(); c
我想为 google chrome/chromium 编写一个扩展(一个 session 管理器,它比画廊中已有的具有更多的功能和视觉效果)。 但是我无法让下面的代码工作: function list
我正在使用 Guava LoadingCache 将所有元素一次批量加载到我的急切缓存中。但是执行loadAll我提供的方法实际上并不需要 Iterable keys 参数,因为我的 DAO 也不排除
我正在使用 getAll()从数据库中获取所有项目的方法。 db.transaction('history', 'readonly').objectStore('history').getAll().
我是一名优秀的程序员,十分优秀!