Множественное асинхронное ожидание с циклом for

#javascript #async-await #watermelondb

#javascript #асинхронное ожидание #watermelondb

Вопрос:

Я хочу запустить несколько функций с async / await, включая также цикл for. Цикл, также необходимый для запуска друг друга, завершен. В настоящее время я использую эту функцию и, похоже, она работает некорректно.

Для запроса цикла for мне нужен идентификатор, созданный в первом запросе, чтобы выполнить его.

 const createStudent = async (studentObj) => {
    try {
        await database.action(async () => {
            const newStudent = await studentCollection.create(student => {
                student.name = studentObj.name
                student.age = studentObj.age
            })

            for (let contactObj of studentObj.contacts) {
                try {
                    await contactCollections.create(contact => {
                        contact.student_id = newStudent.id
                        contact.type = contactObj.type
                        contact.contact = contactObj.contact
                    })
                } catch (error) {
                    console.log(error);
                }
            }
        })
    } catch (error) {
        console.log(error);
    }
}
  

в настоящее время я получаю сообщение об ошибке

 [WatermelonDB] The action you're trying to perform (unnamed) can't be performed yet, because there are 2 actions in the queue. 
Current action: unnamed. Ignore this message if everything is working fine. 
But if your actions are not running, it's because the current action is stuck. 
Remember that if you're calling an action from an action, you must use subAction(). See docs for more details.
  

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

1. database.action возвращает ли обещание?

2. @JaromandaX да

3. Я ничего не знаю об WatermelonDB, но, судя по виду сообщения, маловероятно, что функция, которой вы передали database.action , вообще вызывается. В этом случае проблема не будет иметь никакого отношения к вашему циклу. Проверьте это с помощью console.log.

Ответ №1:

Да, вы правы!. Это не будет работать должным образом с несколькими запросами записи создания базы данных вместе.

Всякий раз, когда вы вносите более одного изменения (создание, удаление или обновление записей) в действие, вы должны их пакетировать.

Смотрите: https://nozbe.github.io/WatermelonDB/Actions.html

Вы можете сделать так:

 const batchActions = [];

for (let contactObj of studentObj.contacts) {
  batchActions.push(
    contactCollections.prepareCreate(contact => {
      contact.student_id = newStudent.id
      contact.type = contactObj.type
      contact.contact = contactObj.contact
    })
  )
}

database.batch(batchActions)  

Надеюсь, это решит вашу проблему