asyn c ждете синхронизации служебной функции? - PullRequest
0 голосов
/ 23 января 2020

Если мы определим вспомогательную функцию следующим образом:

/**
 * Delete the entire database
 */
export async function deleteDatabase(db) {
  await db.delete()
}

И мы ее вызовем.

deleteDatabase(db)
nextFunction()

Тогда следующая функция не будет вызываться до тех пор, пока db.delete() не завершится правильно ?

Я думаю, что так оно и есть, поэтому я просто хочу подтвердить семантику.

Dex ieJS Демо

Включение ответов в этот Dex ieJS Демонстрация для тех, кто заинтересован в фактическом использовании:

https://stackblitz.com/edit/typescript-dexie-one-to-many

Ответы [ 4 ]

7 голосов
/ 23 января 2020

"Тогда следующая функция не будет вызвана, пока db.delete() не завершится правильно?" Неправильно. Он будет называться ДО asyn c Операция завершена.

const delay = ms => new Promise(resolve => setTimeout(resolve, ms))

async function deleteDatabase() {
  console.log('Deleting DB')
  await delay(1000)
  console.log('DB deleted')
}

function nextFunction() {
  console.log('Next function')
}

deleteDatabase()
nextFunction()

Вам нужна другая функция оболочки async/await или используйте .then для объединения обещаний

deleteDatabase().then(nextFunction)
3 голосов
/ 23 января 2020
deleteDatabase(db)

Это выражение немедленно возвращается с обещанием.

Так что nextFunction() будет вызвано до того, как db.delete () завершит

Вам также следует дождаться deleteDatabase(db)

2 голосов
/ 23 января 2020

Если они находятся в асинхронном c контексте, следующая функция вызываться не будет, , только если вы ставите ожидание перед deleteDatabase

Примерно так:

async myFunc(db) {
    await deleteDatabase(db)
    nextFunction()
}

Или даже:

async myFunc(db) {
    return deleteDatabase(db)
        .then(() => 
            nextFunction()
        )
}
1 голос
/ 23 января 2020

Если вы называете это как

deleteDatabase(db)
nextFunction()

Следующая функция будет вызвана немедленно, поскольку вы ее не ожидаете.

Вам нужно ждать

await deleteDatabase(db)
nextFunction()
...