Comment dois-je attendre une promesse à terminer avant de retourner la variable d'une fonction?

je suis toujours aux prises avec des promesses, mais je fais des progrès grâce à la communauté ici.

j'ai une fonction JS simple qui interroge une base de données Parse. Il est supposé retourner le tableau de résultats, mais évidemment en raison de la nature asynchrone de la requête (d'où les promesses), la fonction retourne avant les résultats, me laissant avec un tableau non défini.

Que dois-je faire pour que cette fonction attende le résultat du promesse?

Voici mon code:

function resultsByName(name)
{   
    var Card = Parse.Object.extend("Card");
    var query = new Parse.Query(Card);
    query.equalTo("name", name.toString());

    var resultsArray = [];

    var promise = query.find({
               success: function(results) {
               // results is an array of Parse.Object.
                             console.log(results);
                             //resultsArray = results;
                             return results;
               },

               error: function(error) {
               // error is an instance of Parse.Error.
                             console.log("Error");
               }
    });                           

}
82
demandé sur mac_55 2015-01-04 00:12:10

4 réponses

au lieu de retourner un resultsArray vous retournez une promesse pour un tableau de résultats et ensuite then que sur le site d'appel - cela a l'avantage supplémentaire de l'appelant sachant que la fonction exécute asynchrone I/O. codage simultanéité dans JavaScript est basé sur cela - vous pourriez vouloir lire cette question pour obtenir une idée plus large:

function resultsByName(name)
{   
    var Card = Parse.Object.extend("Card");
    var query = new Parse.Query(Card);
    query.equalTo("name", name.toString());

    var resultsArray = [];

    return query.find({});                           

}

// later
resultsByName("Some Name").then(function(results){
    // access results here by chaining to the returned promise
});

vous pouvez voir plus d'exemples d'utilisation des promesses parse avec des requêtes dans Blog propre de Parse à ce sujet .

41
répondu Benjamin Gruenbaum 2017-05-23 12:34:54

Que dois-je faire pour que cette fonction attende le résultat de la promesse?

utiliser async/await (ne fait pas partie de ECMA6, mais disponible pour Chrome, Edge, Firefox et Safari depuis fin 2017, Voir canIuse )

MDN

    async function waitForPromise() {
        let result = await Promise.resolve('this is a sample promise');
    }

au passage: C# est d'avoir ce pour quelques années(!) déjà.

6
répondu Martin Meeser 2017-12-22 12:02:29

vous ne voulez pas faire attendre la fonction, parce que JavaScript est destiné à être non-bloquant. Retourne plutôt la promesse à la fin de la fonction, la fonction d'appel peut utiliser la promesse d'obtenir la réponse du serveur.

var promise = query.find(); 
return promise; 

//Or return query.find(); 
5
répondu Trace 2018-01-05 21:11:50

vous n'utilisez pas de promesses ici. Analyser vous permet d'utiliser des rappels ou des promesses; votre choix.

Pour utiliser des promesses, procédez de la manière suivante:

query.find().then(function() {
    console.log("success!");
}, function() {
    console.log("error");
});

maintenant, pour exécuter des choses après que la promesse est terminée, vous pouvez simplement l'exécuter à l'intérieur du callback de la promesse à l'intérieur de l'appel then() . Jusqu'à présent, ce serait exactement la même que régulièrement des rappels.

pour réellement faire bon usage des promesses est quand vous chaîne eux, comme ceci:

query.find().then(function() {
    console.log("success!");

    return new Parse.Query(Obj).get("sOmE_oBjEcT");
}, function() {
    console.log("error");
}).then(function() {
    console.log("success on second callback!");
}, function() {
    console.log("error on second callback");
});
2
répondu mash 2015-01-03 21:15:51