React Native中的Promise调用

时间:2019-03-11 00:09:05

标签: javascript react-native react-native-android

React Native和Javascript的新增功能。目前,我正在尝试制定一个Promise,以在使用react-native-sqlite-storage软件包时处理未定义的错误。

我一直在关注上一篇文章here,但根据我的判断,并没有成功地正确实施Promise。

这是我当前的功能:

nextPackage (q_id: number) {
    return new Promise((resolve, reject) =>
        db.transaction(tx => { 
            tx.executeSql(
                'SELECT * FROM Questions INNER JOIN Choices on Choices.q_id = Questions.global_id WHERE Questions.global_id = ?', [q_id], (tx, results) => {
                    for (let i = 0; i < results.rows.length; i++) {
                        console.log('item:', i);
                        console.log('row:', results.rows.item(i));
                        this.pack.push(results.rows.item(i));
                    }
                    resolve(this.pack);
                }, function (tx, error) {
                    reject(error);
            });
        })
    )
}

调用它的屏幕:

this.pack = this.wrapper.nextPackage(this.session.data_next.qID)
        .then(data => { 
            console.log("Retrieved data: ", data);
        })
        .catch(error => {
            console.error(error);
        })

    this.pkHelp = new PackageHelper(this.pack);

但是,当我尝试访问this.pack[0]时,会收到undefined is not an object (evaluating 'this.pack[0].choiceType')。 console.log()表明确实正在读取数据库行,并且choiceType确实是正确的列名。

在此先感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

您不能像这样将值分配给包装。返回的值在then部分中。你可以做这样的事情

this.wrapper.nextPackage(this.session.data_next.qID).then(data => {
   this.pkHelp = new PackageHelper(this.pack);
}).catch(error => {
   console.error(error);
});

或者您可以使用await。但是您必须在async函数中使用它

try {
   this.pkHelp = await this.wrapper.nextPackage(this.session.data_next.qID);
   this.pkHelp = new PackageHelper(this.pack);
} catch(error) {
   console.error(error);
}