当前位置: 首页 > 知识库问答 >
问题:

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

令狐宏浚
2023-03-14

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

我有一个简单的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个答案

左丘源
2023-03-14

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

使用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');
    }
宗政财
2023-03-14

不是返回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自己的关于它的博客文章中看到更多使用解析承诺和查询的示例。

 类似资料:
  • 我对这段代码有一个问题,其中语句是在函数之前触发的,它返回0而不是正确的值。有没有办法在返回之前强制完成?我知道这是一个逻辑问题,因为如果我删除处的注释,它就可以正常工作。 如何在不使用或应用程序中的任何其他类型的超时?原始代码: 编辑代码: 这是StorageInformation类 从接口调用StorageInformation 我还尝试了r2rek的解决方案,得到了相同的结果 欢迎提出任何问

  • 我正在使用节点8.x。因此,我可以访问所有最新的特性,如异步/等待等。 该场景类似于以下内容(语法不正确,仅供解释): 基本上,User对象的创建依赖于address对象的创建。我希望createUser函数异步执行,即尽快返回一个promise而不等待address对象的创建。 这个问题的目的不是完成任务,而是了解在异步编程中解决这类问题的最佳方法是什么。 我能想到的方法不多:1:创建一个新的p

  • 我使用的是Firebase Cloud Firestore,然而,我认为这可能更像是JavaScript异步与同步promise返回的问题。 我正在执行一个查询以从一个集合中获取ID,然后循环该查询的结果以根据该ID从另一个集合中查找单个记录。 我怎么能等到forEach完成后才从外部promise和外部函数本身返回呢?

  • 问题内容: 我正在尝试在Node.js / Express中创建一个路由,该路由从两个查询中读取数据,然后基于来自查询的数据来增加计数。由于Node.js是异步的,因此在读取所有数据之前会显示总计。 我创建了一个简单的示例,以达到我目前正在做的事情 我不确定要等到两个功能都完成后才能打印总计,我该做什么。我是否需要创建一个自定义事件发射器来实现这一目标? 问题答案: 拥抱异步性: 或使用Promi

  • 问题内容: 我有以下 我有一个运行一些ajax的函数,然后根据ajax是否成功返回true或false。我从代码的多个位置调用了这个ajax函数。 因为该函数在ajax完成之前结束,所以它总是返回false。如何避免这种情况? 我读到一些建议我在函数中执行的操作,然后将和函数移至我的和函数。但是,在我的方法中,我进行了大量的计算。很多代码。因此,问题在于,如果我将功能移至其他功能,那么我将复制一堆