webentwicklung-frage-antwort-db.com.de

Wie warte ich auf das Ende eines Versprechens, bevor ich die Variable einer Funktion zurückgebe?

Ich kämpfe immer noch mit Versprechungen, mache aber dank der Community hier einige Fortschritte.

Ich habe eine einfache JS-Funktion, die eine Parse-Datenbank abfragt. Es soll das Array mit den Ergebnissen zurückgeben, aber aufgrund der asynchronen Natur der Abfrage (daher die Versprechungen) wird die Funktion vor den Ergebnissen zurückgegeben, sodass ich ein undefiniertes Array habe.

Was muss ich tun, damit diese Funktion auf das Ergebnis des Versprechens wartet?

Hier ist mein 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");
               }
    });                           

}
120
mac_55

Anstatt ein resultsArray zurückzugeben, geben Sie eine Zusage für ein Ergebnis-Array und dann then für die aufgerufene Site zurück - dies hat den zusätzlichen Vorteil, dass der Aufrufer weiß, dass die Funktion asynchrone E/A ausführt. Das Codieren von Parallelität in JavaScript basiert darauf - möglicherweise möchten Sie diese Frage lesen, um eine umfassendere Vorstellung zu erhalten:

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
});

Weitere Beispiele für die Verwendung von Analyseversprechen mit Abfragen finden Sie in Parse's eigener Blog-Beitrag darüber .

56

Was muss ich tun, damit diese Funktion auf das Ergebnis des Versprechens wartet?

Verwenden async/await (NICHT Teil von ECMA6, aber seit Ende 2017 für Chrome, Edge, Firefox und Safari verfügbar, siehe canIuse )
MDN

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

Aufgrund eines Kommentars hinzugefügt: Eine asynchrone Funktion gibt immer ein Versprechen zurück und sieht in TypeScript folgendermaßen aus:

    async function waitForPromise(): Promise<string> {
        // let result = await any Promise, like:
        let result = await Promise.resolve('this is a sample promise');
    }
12
Martin Meeser

Sie möchten die Funktion nicht warten lassen, da JavaScript nicht blockieren soll. Lieber das Versprechen am Ende der Funktion zurückgeben, dann kann die aufrufende Funktion das Versprechen verwenden, um die Serverantwort zu erhalten.

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

//Or return query.find(); 
3
Trace

Sie verwenden hier keine Versprechen. Mit Parse können Sie Rückrufe oder Versprechen verwenden. deine Entscheidung.

Gehen Sie folgendermaßen vor, um Versprechen zu verwenden:

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

Wenn Sie nun nach Abschluss des Versprechens etwas ausführen möchten, können Sie es einfach innerhalb des Versprechens-Rückrufs innerhalb des Aufrufs then() ausführen. Soweit wäre dies genau das gleiche wie bei normalen Rückrufen.

Um Versprechen wirklich gut zu nutzen, müssen Sie sie wie folgt verketten:

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
mash

Ich habe das gleiche Problem, also pflege ich einen Code, Code muss ajax aufgerufen werden, um eine andere Aufgabe zu verarbeiten, hier mein Code

this.bindChangeEvent = function () {
    //select all bind change
    this._select_all.bind('change', function () {
        console.log('All')
        if ($(this).is(":checked")) {
            ///todo: call ajax to get all ids
            var idsAllItem = pointer.getAllData();

            console.log(idsAllItem);
            console.log('Another todo');

Ajax-Funktion

this.getAllData = function() {
    var promises = [];
    var def = new $.Deferred();
    return new Promise((resolve, reject) => {
        // AJAX request
        var url = '...';
        $.ajax({
            url: url,
            type: "get",
            async: true,
            data: {},
            dataType: "json",
            success: function (data) {
                console.log('Ajjax done');
                resolve(data)
            },
            error: function (err) {
                reject(err)
            }
        });
    })
};

und ich bekomme Ergebnis

Another todo
Output
Ajax Done

….

0
dungphanxuan