首页 > 解决方案 > node.js - 无法弄清楚为什么它不等待承诺

问题描述

我对 web-dev 相当陌生,正在编写一个函数来查询我的本地 ES 节点。我已经在 Python 的 REST API POST 上花费了相当多的时间,并且相信我大致了解异步等应该如何根据该经验工作,但我无法弄清楚为什么这个特定功能不等待查询并始终回报承诺。当前的实现如下所示:

async function query (index_name, body_json){
    try{
        let sr = await(client.search({
            index: index_name,
            body: {"query": body_json,
                   "size": 15
            }
        }));
        return sr
    }
    catch(e){
        console.log(e);
        throw e;
    }
}

我原来的实现.then().catch()是这样使用的:

    client.search({
        index: index_name,
        body: {
            "query": {
                "match_all": {}
                // this is where "body_json" param would go
            },
            "size": 15
        }
    })
        .then(response => console.log(response))
        .catch(error => console.log(error));
}

我也花了一些时间,但更少的时间来玩一些 la this

根据我在网上阅读的内容,这两者在功能上是“等效的”,并且从所有这些 SO 帖子和 Medium 博客的自信语气来看,这表面上应该是微不足道地返回 JSON 结果,但事实并非如此(尚未尝试一个 la this,但注意到这里没有任何异步。如果你知道为什么会这样,那就多谢了)。

真的不确定我哪里出错了。在此先感谢您的帮助。

标签: javascriptnode.jselasticsearch

解决方案


async函数中返回某些东西与返回 Promise 是一样的。因此,您的查询函数返回一个带有client.search. 以下代码将等待您的查询承诺并打印结果。您还可以sr在查询函数中使用该值,因为这里的承诺也已解决。

let result = await query(some_index_name, some_body_json)
console.log(result)

是一个关于 JavaScript Promise 和 async/await 的很棒的教程。


推荐阅读