Jak Mogę używać asynchronicznych / oczekujących na najwyższym poziomie?

Przeglądałem asynchroniczne/oczekujące i po przejrzeniu kilku artykułów, postanowiłem przetestować rzeczy samodzielnie. Jednak nie mogę sobie wyobrazić, dlaczego to nie działa: {]}

async function main() {  
    var value = await Promise.resolve('Hey there');
    console.log('inside: ' + value);
    return value;
}

var text = main();  
console.log('outside: ' + text)

Konsola wysyła następujące (node v8.6.0):

> outside: [object Promise]

> inside: Hey there

Dlaczego komunikat dziennika wewnątrz funkcji wykonuje się później? Myślałem, że powodem utworzenia async / wait było wykonanie synchronicznego wykonywanie zadań asynchronicznych.

Czy istnieje sposób na użycie wartości zwracanej wewnątrz funkcji bez użycia .then() po main()?

Author: Felix Kling, 2017-10-01

3 answers

Nie wiem, dlaczego to nie działa.

Ponieważ main zwraca obietnicę; wszystkie funkcje async tak robią.

Na najwyższym poziomie musisz:

  1. Użyj funkcji najwyższego poziomu async, która nigdy nie odrzuca, lub

  2. Użyj then i catch

#1 - Top-level async funkcja, która nigdy nie odrzuca

(async () => {
    try {
        var text = await main();
        console.log(text);
    } catch (e) {
        // Deal with the fact the chain failed
    }
})();

Zauważ catch; ty musisz obsługiwać obietnice odrzuceń / asynchroniczne wyjątki, ponieważ nic innego nie będzie; nie masz rozmówcy, aby je przekazać. Jeśli wolisz, możesz to zrobić w wyniku wywołania go za pomocą funkcji catch (zamiast try/catch składnia):

(async () => {
    var text = await main();
    console.log(text);
})().catch(e => {
    // Deal with the fact the chain failed
});

...co jest nieco bardziej zwięzłe (podoba mi się z tego powodu).

#2 - then Oraz catch

main()
    .then(text => {
        console.log(text);
    })
    .catch(err => {
        // Deal with the fact the chain failed
    });

...lub oba argumenty do then:

main().then(
    text => {
        console.log(text);
    },
    err => {
        // Deal with the fact the chain failed
    }
);

Ponownie zauważ, że rejestrujemy obsługę odrzucenia.

W tej formie upewnij się, że twoje then callback nie rzuca żadnych błędów (jak nic nie jest zarejestrowany, aby obsłużyć je).

 51
Author: T.J. Crowder,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-16 15:52:13

Ponieważ main() działa asynchronicznie, zwraca obietnicę. Musisz uzyskać wynik w metodzie then(). A ponieważ then() zwraca również obietnicę, musisz zadzwonić process.exit(), aby zakończyć program.

main()
   .then(
      (text) => { console.log('outside: ' + text) },
      (err)  => { console.log(err) }
   )
   .then(() => { process.exit() } )
 0
Author: Peracek,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-19 13:29:17

Faktycznym rozwiązaniem tego problemu jest podejście do Niego inaczej.

Prawdopodobnie Twoim celem jest jakaś inicjalizacja, która zazwyczaj dzieje się na najwyższym poziomie aplikacji.

Rozwiązaniem jest upewnienie się, że istnieje tylko jedna instrukcja JavaScript na najwyższym poziomie aplikacji. Jeśli masz tylko jedną instrukcję na górze swojej aplikacji, możesz używać async / wait w każdym innym punkcie everywhere (oczywiście z zastrzeżeniem normalnej składni rules)

Mówiąc inaczej, owiń cały najwyższy poziom w funkcję tak, aby nie był już najwyższym poziomem i to rozwiązuje pytanie, jak uruchomić asynchroniczne / oczekujące na najwyższym poziomie aplikacji-nie.

Tak powinien wyglądać najwyższy poziom twojej aplikacji:

import {application} from './server'

application();
 0
Author: Duke Dougal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-06 12:23:13