Как любителю PHP-кода, мне трудно понять асинхронное поведение JS.Я пишу Firefox WebExtension, в котором для установки / получения параметров используются две StorageAreas из API-интерфейса хранилища, и я хочу объединить все параметры в один объект для эффективной передачи приложения:
'use strict';
class Options {
constructor() {
this.defaults = {};
this.locals = {};
this.options = {};
}
getDefaults() {
browser.storage.managed.get().then(res => {
this.defaults = res;
});
}
getLocals() {
browser.storage.local.get().then(res => {
this.locals = res;
});
}
get() {
this.getDefaults();
this.getLocals();
this.options = Object.assign(this.defaults, this.locals); // <-- This is where the code fails: this.defaults and this.locals are empty.
return this;
}
}
const opts = new Options().get();
console.log(opts); // Object { defaults: {}, locals: {}, options: {} } background.js:31:1
console.log(Object.keys(opts)); // Array(3) [ "defaults", "locals", "options" ] background.js:32:1
console.log(opts.defaults); // Object { } background.js:33:1
const options = Object.assign(opts.defaults, opts.locals);
console.log(options); // Object { } background.js:36:1
Я указал линию, где ошибка впервые появляется, и после того, как я бьюсь головой об ту же стену в течение 2+ дней, я думаю, что это либо связано с асинхронностьюсимвол Обещания, возвращаемый браузером Firefox browser.storage. *. get () или связанный с областями действия переменных.
Я пытался:
- объявить локальную переменную в get *-functions (let that = this;)
- , использующий async / await в get * -functions
- , связывающий результат get * -functions с этим или this.defaults
- перед созданием этого класса я начал с вложенных Обещаний, но также я не смог создать (глобальную) переменную 'options'.
Спасибо за любые указатели - мой разум устал пересматривать/ переписываю эти 36 лока ...