Невозможно выполнить запрос sqlite db асинхронно в react-native

#react-native #sqlite #react-native-sqlite-storage

#react-native #sqlite #react-native-sqlite-storage

Вопрос:

У меня есть компонент, в котором мне нужно выполнить пару запросов один за другим. Я использовал обещание, но, похоже, оно не работает / я не могу этого сделать. Вот моя часть моего компонента:

 export default function AuthWrapper() {
    useEffect(() => {
        // creating app_tokens table if not exist
        console.log('before first query');
        new Promise((resolve) => {
            db.transaction(function (txn) {
                txn.executeSql(
                    "SELECT name FROM sqlite_master WHERE type='table' AND name='app_tokens'",
                    [],
                    function (tx, res) {
                        console.log('first query executed');
                        resolve(res);
                    },
                    function(error) {
                        console.log(error);
                    }
                );
            });
        });

        console.log('before second query');
        // creating users table
        new Promise((resolve) => {
            db.transaction(function (txn) {
                txn.executeSql(
                    "SELECT name FROM sqlite_master WHERE type='table' AND name='users'",
                    [],
                    function (tx, res) {
                        console.log('second query executed');
                        resolve(res);
                    },
                    function(error) {
                        console.log(error);
                    }
                );
            });
        });

        console.log('before third query');
        // creating institute_details table
        new Promise((resolve) => {
            db.transaction(function (txn) {
                txn.executeSql(
                    "SELECT name FROM sqlite_master WHERE type='table' AND name='institute_details'",
                    [],
                    function (tx, res) {
                        console.log('third query executed');
                        resolve(res);
                    },
                    function(error) {
                        console.log(error);
                    }
                );
            });
        });
    }, []);
}
 

Когда я запускаю этот журнал кода, он отображается следующим образом:

 before first query
before second query
before third query

first query executed
second query executed
third query executed
 

Но это должно быть так:

 before first query
first query executed

before second query
second query executed

before third query
third query executed
 

Кто-нибудь может мне помочь, чего мне не хватает!

К вашему сведению: я использую

 "react": "16.11.0",
"react-native": "0.62.2",
"react-native-sqlite-storage": "^5.0.0",
 

Ответ №1:

Вы спрашиваете это неправильно, вы хотите, чтобы это было синхронно, как я, посмотрев на желаемый результат.

Для этого существует async — await .

Я не знаю, почему вы использовали promise, но, да, с кодом, который у вас есть прямо сейчас, вы можете сделать что-то вроде этого,

 const myFirstFunction = () => {
  return new Promise((resolve) => {
    db.transaction(function (txn) {
      txn.executeSql(
        "SELECT name FROM sqlite_master WHERE type='table' AND name='app_tokens'",[],
        function (tx, res) {
          console.log('first query executed');
          resolve(res);
        },
        function (error) {
          console.log(error);
        },
      );
    });
  });
};

const mainFunction = async () => {
  console.log('before first query');
  await myFirstFunction();
  // ... similarlly create and call other functions here
  // ... creating different methods will be easy to maintain
};

useEffect(() => {
  mainFunction();
}, []);
 

Комментарии:

1. Спасибо за ваше время. асинхронный означает выполнение одного за другим, а синхронный означает выполнение всего вместе, верно!. Я хочу выполнить свой первый запрос и все, что с ним связано, затем хочу выполнить свой второй и так далее. Прямо сейчас мой код запускает весь запрос целиком. Я также попробовал ваш код, он также дает тот же результат.

2. Извините, я виноват. Он работает. Спасибо, что так хорошо объяснили это на хорошем примере