2016-01-05 1 views
2

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

Использование синтаксиса ES7, я бы предположить, что await -ную Promise будет такой же, как await -ную функцию, которая возвращает Promise, но он не работает:

async function tester() { 
    async function foo() { await setTimeout(() => {}, 2000)} 
    async function bar() { await setTimeout(() => {}, 1000)} 
    let rcFoo = foo(); 
    let rcBar = await bar(); 
    if (true) { // Some conditional based on rcBar 
     await rcFoo; 
     console.log(rcFoo); // It's a Promise object 
    } 
} 

Два вопроса:

  1. Я даже правильно понимаю асинхронный характер Javascript? Если бы вышеприведенный код работал бы, я бы достиг своей цели одновременного запуска двух асинхронных функций - ish, или это просто невозможно сделать?
  2. Возможно ли как-то await объект, который является Promise, как я пробовал, или он должен ссылаться на функцию напрямую?

Спасибо ..

+0

Вы должны уметь «ждать» 'Promise', потому что' async' - это всего лишь сахара вокруг создания 'Promise'. Однако вы не можете использовать 'await' вне функции' async', так что, возможно, это и есть ваша проблема. –

+0

Этот фрагмент кода уже находился в функции 'async'. –

+0

Это может быть, но ваш пример не показывает это, поэтому я не знаю :-) –

ответ

0
  1. В коде foo начнется сразу же, а затем bar начнется. Даже если foo занял первое место, ваш код все еще ждет для обещания bar, прежде чем продолжить.
  2. Вы можете ждать все, пока это обещание, будь то переменная или возвращаемое значение из вызова функции. Насколько я знаю (могу ошибаться), SetTimeout не возвращает обещание, но это было бы легко превратить его в один:

    async function foo() { 
        return new Promise(resolve => setTimeout(resolve, 2000)) 
    } 
    async function bar() { 
        return new Promise(resolve => setTimeout(resolve, 1000)) 
    } 
    
+1

Правильно, 'setTimeout' не возвращает обещание, а непрозрачный объект, который идентифицирует тайм-аут. Этот объект может быть передан 'clearTimeout' для отмены таймаута до истечения срока его действия. –

0

Я предположил бы, что await -ing обещание будет таким же, как await -ный функция, которая возвращает обещание

же, как и в ожидании результата вызова функции, которая возвращает обещание, да (ожидающее обещание).

, но он не работает:

await rcFoo; 
console.log(rcFoo); // It's a Promise object 

Это работа, только await ИНГ переменную не изменяет эту переменную. Вы можете только await значения, и результат обещания станут результатом значение выражения await:

let res = await promise; 
console.log(res); // a value 
console.log(promise) // a promise for the value 

Это говорит, setTimeout не возвращает обещание, так что ваш код не спит три секунды. Вам нужно будет его обещать, например, @PedroMSilva показал это.