2
votes

Comment faire fonctionner la fonction asynchrone JS en synchronisation avec les autres?

Le code JS suivant:

START
Before getting 3-sec-something.
Something gotten after 3 sec.
After getting 3-sec-something.
STOP

... imprime ce qui suit:

START
Before getting 3-sec-something.
STOP
Something gotten after 3 sec.
After getting 3-sec-something.

Comment puis-je l'ajuster pour imprimer ce qui suit ?

function promise_GetSomething() {
    return new Promise(resolve => {
        setTimeout(function () {
            resolve("Something gotten after 3 sec.");
        }, 3000);
    });
}

async function logAboutSomethingGotten() {
    console.log("Before getting 3-sec-something.");
    var somethingGotten = await promise_GetSomething();
    console.log(somethingGotten);
    console.log("After getting 3-sec-something.");
}

function doSomething() {
    console.log("START");
    logAboutSomethingGotten();
    console.log("STOP");
}

doSomething();

De plus, si l'async logAboutSomethingGotten () renvoie une valeur, comment la valeur peut-elle être obtenue et utilisée de manière synchrone?

EDIT (UTC 2019-01-12 23:14):

Merci aux répondeurs actuels. Les réponses actuelles suggèrent toutes de faire asynchroniser doSomething () et d'attendre logAboutSomethingGotten () . Je le savais aussi, mais comme cela pouvait conduire à un code asynchrone sans fin, je n'aimais pas cette solution. De plus, l'option consistant à envoyer un .then (function () {console.log ("STOP");}) vers logAboutSomethingGotten () résoudrait aussi facilement cela, mais pas dans tous les scénarios, comme pour la partie synchrone de ma question.

Donc, je suis particulièrement intéressé si logAboutSomethingGotten () renvoie une valeur (par exemple après avoir fait un appel Ajax, car Ajax synchrone est obsolète). Par quels moyens intelligents puis-je utiliser cette valeur renvoyée dans un flux synchrone?


0 commentaires

3 Réponses :


1
votes

Faites ceci->

function promise_GetSomething() {
    return new Promise(resolve => {
        setTimeout(function () {
            resolve("Something gotten after 3 sec.");
        }, 3000);
    });
}

async function logAboutSomethingGotten() {
    console.log("Before getting 3-sec-something.");
    var somethingGotten = await promise_GetSomething();
    console.log(somethingGotten);
    console.log("After getting 3-sec-something.");
}

async function doSomething() {
    console.log("START");
    await logAboutSomethingGotten();
    console.log("STOP");
    
}

doSomething();

Vérifiez l'extrait-

async function doSomething() {
    console.log("START");
    await logAboutSomethingGotten();
    console.log("STOP");

}


0 commentaires

1
votes

Marquez simplement doSomething comme async , puis wait l'appel logAboutSomethingGotten (); .

Si l'async logAboutSomethingGotten () renvoie une valeur, comment la valeur peut-elle être obtenue et utilisée de manière synchrone?

Un résultat asynchrone ne peut jamais être utilisé de manière synchrone. Bien sûr, après avoir attendu la promesse, vous pouvez toujours utiliser la valeur de retour comme d'habitude.


2 commentaires

Je suis particulièrement intéressé par l'utilisation du résultat asynchrone de manière synchrone. En fait, j'ai compris que je pourrais continuer à ajouter "async" et "attendre" à l'infini. Pouvez-vous s'il vous plaît fournir une solution de contournement?


@Olumide Non. Quand j'ai écrit jamais , je voulais dire que c'était impossible. Vous devez ajouter async et wait partout.



0
votes

Définissez votre fonction doSomething pour qu'elle soit également asynchrone et attendez logAboutSomethingGotten.

function promise_GetSomething() {
    return new Promise(resolve => {
        setTimeout(function () {
            resolve("Something gotten after 3 sec.");
        }, 3000);
    });
}

async function logAboutSomethingGotten() {
    console.log("Before getting 3-sec-something.");
    var somethingGotten = await promise_GetSomething();
    console.log(somethingGotten);
    console.log("After getting 3-sec-something.");
}

async function doSomething() {
    console.log("START");
    await logAboutSomethingGotten();
    console.log("STOP");
}

doSomething();


0 commentaires