gpt4 book ai didi

javascript - 在我从数据库接收之前如何异步等待?

转载 作者:IT王子 更新时间:2023-10-29 06:30:00 25 4
gpt4 key购买 nike

我正在尝试制作可以通过屏幕访问的商店。文件结构:

  1. index.ios.js
  2. /app/index.js
  3. /app/store/database.js
  4. /app/store/userStore.js

index.ios.js :

import { AppRegistry } from 'react-native';
import App from './app/index';
AppRegistry.registerComponent('AwesomeProject', () => App);

/app/index.js :

import React, { Component} from 'react';
import {
Text,
View,
} from 'react-native';
import userStore from './store/userStore';
import ViewBackground from './components/ViewBackground';

class App extends Component {
constructor(props){
super(props);
this.isLoggedIn = true;
}

componentDidMount() {
this.fetchUsers().done();
}

async fetchUsers(){
console.log('Before User Fetch');
var result = await userStore.getAllUsers();
console.log('After User Fetch');
}

render() {
if(this.isLoggedIn){
return this.loggedInView();
}else{
return this.loggedOutView();
}
}

loggedInView(){
return <ViewBackground>

</ViewBackground>
}

loggedOutView(){
return <View>
<Text>Hi, This is logged Out view </Text>
</View>
}
}

export default App;

/app/store/userStore.js :

import React from 'react';
import database from './database';

class UserStore{

async getAllUsers(){
let query = {
type: 'SELECT',
sql: 'SELECT * FROM Users',
vals: [],
}
let queries = [query];
console.log('in store before');
let dbResult = await database.runQuery(queries);
console.log('in store after');
return dbResult;
}
}

const userStore = new UserStore;

export default userStore;

/app/store/database.js :

    'use strict';
import React from 'react';
import SQLite from 'react-native-sqlite-storage';
SQLite.enablePromise(true);

var database_name = "test.db";
var database_version = "1.0";
var database_displayname = "Test";
var database_size = 1024 * 1024 * 10;

class Database {

constructor(){
SQLite.openDatabase(database_name, database_version, database_displayname, database_size).then(this.dbOpenSuccess).catch(this.dbOpenError);
}

dbOpenSuccess(dbInstance){
this.conn = dbInstance;
}

dbOpenError(err) {

}

getConnection() {
return this.conn;
}

setUpDatabase(){
let queries = [
'CREATE TABLE IF NOT EXISTS Users (user_id INTEGER PRIMARY KEY, f_name VARCHAR(64), l_name VARCHAR(64), email_id VARCHAR(128), mobile VARCHAR(10))'
];
this.conn.transaction( tx => {
queries.map( q => {
tx.executeSql(q, [], res => {}, err => {});
});
});
}

async runQuery(queries) {
await this.conn.transaction(tx => {
return Promise.all(queries.map(async (q) => {
try {
let results = null;
switch(q.type){
case 'SELECT':
results = await tx.executeSql(q.sql, q.vals);
console.log('Query', q, 'Executed. results:', results);
break;
}

} catch(err) {
console.log('Something went wrong while executing query', q, 'error is', err);
}
}));
});
return false;
}

closeDatabase(){
this.conn.close().then(this.dbCloseSuccess).catch(this.dbCloseError);
}

dbCloseSuccess(res) {

}

dbCloseError(err){

}
}

const dbInstance = new Database();

dbInstance.setUpDatabase();

export default dbInstance;

在/app/index.js 中,我试图从 userStore.js 中获取用户,这将调用 database.js 从数据库中检索用户。我想在从数据库中获取用户时暂停执行,所以尝试了 async/await。我使用 console.log() 检查执行是否暂停。 async/await 都不起作用。我在 所有 console.log 完成后收到响应。

我希望它等到我从数据库接收数据。

最佳答案

需要用Promise包装,sql执行完再解析结果。

例如

async () => {
return new Promise((resolve, reject) => {
db.transaction(tx => {
tx.executeSql('SELECT * FROM users;', [], (tx, results) => {
const { rows } = results;
let users = [];

for (let i = 0; i < rows.length; i++) {
users.push({
...rows.item(i),
});
}

resolve(users);

});
});
});

}

关于javascript - 在我从数据库接收之前如何异步等待?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44264955/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com