离子存储在承诺中未定义?

Ionic Storage undefined in promise?

我有一个 Ionic 2 应用程序,它以列表的形式显示包内的用户项目。我创建了一个函数来检索包内的当前项目索引,它在用户启动应用程序时被触发。它检查离子存储(内部)内存中的索引名称-值对是否为空。在这种情况下,索引设置为 0 并存储在内部和工作内存中。否则,从内存中检索索引并用于设置工作内存。

但是,下面代码中的 self.storage.set(myString, '0'); 会抛出错误 TypeError: Cannot call method 'set' of undefined。我使用 console.dir 进行了检查,确实 self.storagethen(...); 块中未定义。为什么会这样,我该如何解决?

导入、声明、构造函数

import { Injectable } from '@angular/core';

import { Storage } from '@ionic/storage';

declare var self: ItemStorageService;

@Injectable()
export class ItemStorageService {
    workingMemoryItems: Array<any>;
    workingMemoryIndex: number;
    packageIndex: number;

    constructor(public storage: Storage) {
        self = this;
        self.packageIndex = 0;

        self.initializeIndex().then(
            res => {
                console.log(res);
            },
            err => {
                console.log(err);
            }
        )
    }
// Other methods including initializeIndex()
}

初始化索引函数

public initializeIndex(): Promise<any> {
    console.dir(self.storage); // Returns Storage object
    var myString = 'index_item_package_' + self.packageIndex;
    return new Promise((resolve, reject) => {
        self.storage.get(myString).then(
            val => {
                if ((val === null) || (val === 'null')) {
                    console.dir(self.storage); // Returns undefined
                    self.storage.set(myString, '0');
                    self.workingMemoryIndex = 0;
                    resolve('Working memory index not found and set to 0');
                } else {
                    self.workingMemoryIndex = val as number;
                    resolve('Working memory index found and set to ' + val);
                }
            },
            err => {
                self.storage.set(myString, 0);
                self.workingMemoryIndex = 0;
                reject('Working memory index not found and set to 0');
            }
        )
    });
}

我认为发生这种情况的原因是因为在我的每个页面和服务的顶部都声明了全局变量 self。这意味着当我是运行self.storage.get(myString)时,ItemStorageService的构造函数是运行并重新初始化self指向它自己。

解决这个问题的方法不是在任何地方都使用 self,而是只在需要的地方(比如在回调函数中)使用它,并确保将 self = this 设置得尽可能靠近它使用的地方.

尝试删除 self = this 并只使用 this

喜欢:

this.packageIndex = 0;this.storage.get(myString).then(...