提问者:小点点

在返回函数的变量之前,我如何等待一个promise完成?


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

我有一个简单的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");
               }
    });                           

}

共2个答案

匿名用户

不是返回resultsarray,而是返回一个results数组的承诺,然后在调用站点上返回然后-这有一个额外的好处,即调用方知道函数正在执行异步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自己的关于它的博客文章中看到更多使用解析承诺和查询的示例。

匿名用户

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

使用Async/Await(不是ECMA6的一部分,但自2017年底起可用于Chrome、Edge、Firefox和Safari,请参阅canIuse)
MDN

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

由于注释而添加:一个异步函数总是返回一个承诺,在TypeScript中,它看起来像:

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

相关问题