Как получить asyn c, ждать результата функции синхронно - PullRequest
0 голосов
/ 21 января 2020

Я узнал о понятиях Асин c и Await. Я пытался использовать его, но не получил желаемых результатов.

Моя асинхронная c функция:

let get_server_resource = async () => {
    let a = await x();
    let b = await b();
    return {
        a: a, b: b
    }

}

Вызов функции находится в другой области.

let main = async () => {

    result = await get_server_resource();
    console.log(result);
}

Однако это не работает. Как правильно использовать await и asyn c?

Спасибо.

Ответы [ 2 ]

1 голос
/ 21 января 2020

aysn c функции не возвращают значение, они возвращают Promise

, поэтому вы не можете получить значение из них, пока не дождетесь их, это может быть сделано различными способами, ключевое слово await - это проще всего, и внутри вашего асин c кода вы всегда можете вызвать функцию syn c

async useServerData()
{

    result = await get_server_resource();
    console.log(result);
    processServerResource(result)

}
processServerResource(resource)
{
    do Something
}

. Преимущество этого состоит в том, что вы не блокируете свой код

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

get_server_resource().then(processServerResource);

, действительно плохой вариант - объявить результат вне рамок вашего обещания, а затем продолжать проверять, установлен ли он

let result = null;
let main = async () => {

    result = await get_server_resource();
    console.log(result);
}
main();
while(result ===null)
{
}
processServerResource(result)

опять же это не рекомендуемое решение

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise#Methods

0 голосов
/ 21 января 2020

Если я вас правильно понял, проблема в том, что вы вызываете функцию Main (). Ваша функция Main () фактически возвращает Promise, и вы должны обрабатывать его так, даже если результат вам не интересен. Так что из не асинхронной c функции вы вызываете Main как:

Main()
    .then((result) => { /* ...continue */ })
    .catch(error) => { /* ...what happened if an error occurred */ }); 
...