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

Posted

技术标签:

【中文标题】离子存储在承诺中未定义?【英文标题】:Ionic Storage undefined in promise? 【发布时间】:2018-01-17 15:54:37 【问题描述】:

我有一个 Ionic 2 应用程序,它以列表的形式显示包内的用户项目。我创建了一个函数来检索包内的当前项目索引,它在用户启动应用程序时被触发。它检查 Ionic Storage(内部)内存中的索引名称-值对是否为空。在这种情况下,索引设置为 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 我在我的导入下面声明它,并在我的构造函数中设置var self = this; 你能把这部分也添加到问题中吗?您是否在构造函数中使用var 创建一个新变量?你不应该分配给你已经声明的变量吗? 我的错,我使用的是同一个变量。为了更清楚,我在代码中添加了。 箭头函数是词法绑定的,你可以在这里使用this 【参考方案1】:

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

解决此问题的方法是不要在任何地方使用self,而只在需要的地方(比如在回调函数内部)使用,并确保将self = this 设置在尽可能接近使用它的位置。

【讨论】:

【参考方案2】:

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

喜欢:

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

【讨论】:

以上是关于离子存储在承诺中未定义?的主要内容,如果未能解决你的问题,请参考以下文章

财产在承诺中未定义,但在承诺之外工作

为啥在带有 http 承诺的打字稿模块中未定义“this”

在 IE11 中未定义获取错误承诺

未捕获(承诺):TypeError:无法读取未定义的属性“创建”(离子 3.9,Angularjs 5.0.3)

为什么在构造函数中初始化的成员变量会在离子角的ngInit中未定义?

反应本机中未处理的承诺拒绝错误?