我还在为承诺而挣扎,但多亏了这里的社区,我取得了一些进展。

我有一个简单的JS函数查询解析数据库。它应该返回结果数组,但显然由于查询的异步性质(因此承诺),函数在结果之前返回,留给我一个未定义的数组。

我需要做什么来让这个函数等待承诺的结果?

这是我的代码:

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

}

当前回答

您不希望让函数等待,因为JavaScript的目的是非阻塞的。 而不是在函数的末尾返回promise,然后调用函数可以使用promise来获得服务器响应。

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

//Or return query.find(); 

其他回答

我需要做什么来让这个函数等待承诺的结果?

使用async/await(不是ECMA6的一部分,但是 自2017年底起适用于Chrome, Edge, Firefox和Safari,见canIuse) 中数

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

因评论而增加: async函数总是返回一个Promise,在TypeScript中它看起来像:

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

你在这里没有使用承诺。Parse允许你使用回调或承诺;你的选择。

要使用承诺,请执行以下步骤:

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

现在,要在promise完成后执行一些东西,你可以在then()调用的promise回调中执行它。到目前为止,这将与常规回调完全相同。

当你把承诺串联起来的时候,你就能很好地利用承诺,就像这样:

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

而不是返回resultsArray,而是返回一个结果数组的承诺,然后在调用站点上返回结果数组——这有一个额外的好处,即调用者知道函数正在执行异步I/O。在JavaScript中编写并发代码就是基于这一点——你可能想要阅读这个问题来获得更广泛的想法:

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

你可以在parse自己的博客文章中看到更多使用parse承诺和查询的例子。

您不希望让函数等待,因为JavaScript的目的是非阻塞的。 而不是在函数的末尾返回promise,然后调用函数可以使用promise来获得服务器响应。

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

//Or return query.find();