2016-08-13 4 views
1

Я использую async await через babel-plugin-transform-async-to-generator.Ждать глубоких асинхронных ожиданий от глубоких вызовов функций?

На верхнем уровне я жду ответа функции. Затем есть еще две асинхронные функции func1 и func2. func2 асинхронно извлекает содержимое https://www.google.com.

Следующие возвращает сценарий:

go() called 
func1() called 
finished 
func2() called 
func2() called 
func2() called 

Как только console.log('finished') после всего вызова выполняются успешно? Возможно ли, если он не будет возвращать их явно как Promise s с помощью разрешения/отклонения?

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

const rp = require('request-promise') 

go() 

async function go() { 
    console.log("go() called") 
    await func1([1,2,3]) 
    console.log("finished the script") 
} 

async function func1(arr) { 
    console.log("func1() called") 
    arr.forEach(async function(element) { 
    await func2() 
    }) 
} 

async function func2() { 
    var res = await rp('https://www.google.com') 
    console.log("func2() called") 
} 
+0

'console.log (« завершен скрипт »)' не ждет 'await func1 ([1,2,3])'? Вы также можете использовать 'Promise.all()' – guest271314

+0

Можете ли вы иметь две 'await' в одной и той же функции? Если да, возможно, вам нужно удалить ключевое слово 'async' из цикла' forEach'. (Я никогда не использовал async/await) – Cristy

+0

@ guest271314 В моем исходном коде есть рекурсивные вызовы функций, в которых один вызов зависит от результата первого. – Hedge

ответ

0

Я все еще не уверен, как это сделать для рекурсивных вызовов, но создаст отдельный вопрос/пример для него.

Приведенный выше пример можно исправить, используя for..of вместо forEach. Результаты внутренних функций не могут быть await ред.

const rp = require('request-promise') 

go() 

async function go() { 
    console.log("go() called") 
    await func1([1,2,3]) 
    console.log("finished the script") 
} 

async function func1(arr) { 
    console.log("func1() called") 

    for (let item of arr) { 
    await func2() 
    } 
} 

async function func2() { 
    var res = await rp('https://www.google.com') 
    console.log("func2() called") 
} 
Смежные вопросы