How do I wait for a promise to finish before returning the variable of a function?

前端 未结 4 468
情话喂你
情话喂你 2020-11-29 23:15

I\'m still struggling with promises, but making some progress thanks to the community here.

I have a simple JS function which queries a Parse database. It\'s suppose

相关标签:
4条回答
  • 2020-11-29 23:58

    Instead of returning a resultsArray you return a promise for a results array and then then that on the call site - this has the added benefit of the caller knowing the function is performing asynchronous I/O. Coding concurrency in JavaScript is based on that - you might want to read this question to get a broader idea:

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

    You can see more examples of using parse promises with queries in Parse's own blog post about it.

    0 讨论(0)
  • 2020-11-29 23:58

    You're not actually using promises here. Parse lets you use callbacks or promises; your choice.

    To use promises, do the following:

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

    Now, to execute stuff after the promise is complete, you can just execute it inside the promise callback inside the then() call. So far this would be exactly the same as regular callbacks.

    To actually make good use of promises is when you chain them, like this:

    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");
    });
    
    0 讨论(0)
  • 2020-11-30 00:01

    You don't want to make the function wait, because JavaScript is intended to be non-blocking. Rather return the promise at the end of the function, then the calling function can use the promise to get the server response.

    var promise = query.find(); 
    return promise; 
    
    //Or return query.find(); 
    
    0 讨论(0)
  • 2020-11-30 00:02

    What do I need to do to make this function wait for the result of the promise?

    Use async/await (NOT Part of ECMA6, but available for Chrome, Edge, Firefox and Safari since end of 2017, see canIuse)
    MDN

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

    Added due to comment: An async function always returns a Promise, and in TypeScript it would look like:

        async function waitForPromise(): Promise<string> {
            // let result = await any Promise, like:
            let result = await Promise.resolve('this is a sample promise');
        }
    
    0 讨论(0)
提交回复
热议问题