2017-09-29 1 views
0

Je veux faire:Comment arrêter une fonction/revenir d'une promesse?

function save() { 
    //does some stuff here 

    somePromise.then(x => { 
    //do some stuff here 
    }).then(z => { 
    //return statement that makes you leave the function 
    }) 
} 

J'ai une fonction et je veux avoir un retour qui terminera son exécution dans un puis parce que je travaille avec des promesses.

Toute aide ou conseil sera grandement apprécié. Merci d'avance.

+0

Quel est le but de ceci? Utilisez-vous le retour pour quitter la fonction au début? – evolutionxbox

+0

Voulez-vous revenir de la fonction 'save'? – alexmac

+0

Mon conseil, vu comme vos promesses d'utilisation, utilise async/await .. – Keith

Répondre

1

Utilisez return

function save() { 
    //does some stuff here 

    return somePromise.then(x => { 
    //do some stuff here 
    return /* value */ 
    }).then(z => { 
    //return statement that makes you leave the function 
    return /* value */ 
    }) 
} 
+1

Je ne sais pas pourquoi cela a été déprécié, la question de OP est mal formulée, mais si je devais parier sur une réponse qui serait, –

+0

@BenjaminGruenbaum aurait déjà demandé quelle était la raison pour "downvote", afin d'améliorer ou de supprimer Réponse ; si SO encourage explicitement "downvote" sans raison valable https://meta.stackoverflow.com/questions/356706/moderator-deleting-comments-by-op – guest271314

+0

Je n'ai jamais voté en bas ,. Mais je l'ai interprété comme étant capable de revenir conditionnellement d'une chaîne de promesses. Cela retournera toujours – Keith

-1

Le problème est que vous aurez déjà quitté la fonction de sauvegarde() avant alors() fonctionne. Ça ne l'attend pas. Une solution peut être que votre sauvegarde prenne une fonction de rappel en paramètre afin que vous puissiez rappeler le code en attente.

function save(callBack) { 
    //does some stuff here 

    somePromise.then(x => { 
    //do some stuff here 
    }).then(z => { 
    //return statement that makes you leave the function 
    callBack(); 
    }) 
} 

// example of code calling the save 
save(function() { 
    console.log("save is done running, do something here"); 
}); 
+0

Ceci est bien pire que l'autre réponse - que se passe-t-il si 'somePromise' ne remplit pas mais rejette? Que se passe-t-il si 'callBack' est lancé? Qu'en est-il des valeurs de rendement potentiel? Si vous avez déjà une promesse, vous n'avez presque jamais besoin de faire des rappels comme celui-ci. –

+0

Bon point, je ne suis pas sûr de ce que l'OP essaie réellement d'accomplir. Si c'est pour attendre que toutes les promesses soient faites, alors un $ .when() serait mieux ici –

-1

Vous devrez peut-être faire fonctionner votre save pour retourner un Promise

function save() { 
 
    //does some stuff here 
 
    return new Promise((resolve, reject) => { 
 

 
    
 
    somePromise.then(x => { 
 
    resolve("Something1") 
 
    }).then(z => { 
 
     //return statement that makes you leave the function 
 
     resolve("Something2") 
 
    }) 
 
    
 
    } 
 
} 
 

 
save().then(x => { 
 
    console.log(x); // x = something1 || something2 
 
})

0

Ok, vu que vos promesses à l'aide. L'une des meilleures fonctionnalités pour travailler avec des promesses est async/await, la plupart des navigateurs modernes ont même maintenant intégré, si vous avez besoin de cibler les anciens navigateurs, vous pouvez utiliser quelque chose comme babel.

La bonne chose est que vous pouvez continuer à utiliser Javascript avec le code async, comme si elle était synchronisation, y compris pour les boucles/retours/pauses .. etc ..

exemple ci-dessous ..

async function somePromise() { 
 
    console.log('Some promise called'); 
 
} 
 

 
async function earlyReturnTest(doEarly) { 
 
    await somePromise(); 
 
    if (doEarly) return; 
 
    console.log('Return not called'); 
 
} 
 

 
async function run() { 
 
    console.log('Without return'); 
 
    await earlyReturnTest(false); 
 
    console.log(''); 
 
    console.log('With return'); 
 
    await earlyReturnTest(true); 
 
} 
 

 
run();