Node.js NodeJS Elasticsearch返回承诺而不是值
我在我的节点服务器中请求Elasticsearch。这是完美的工作,除了我总是得到一个承诺而不是结果返回 当我记录结果时,它们看起来很完美,但当我返回它们时,我要么什么也得不到,要么得到了承诺 有人能告诉我检索和处理Elasticsearch数据的正确方法吗 我将VueJS与节点服务器和官方Elasticsearch包一起使用Node.js NodeJS Elasticsearch返回承诺而不是值,node.js,vue.js,elasticsearch,Node.js,Vue.js,elasticsearch,我在我的节点服务器中请求Elasticsearch。这是完美的工作,除了我总是得到一个承诺而不是结果返回 当我记录结果时,它们看起来很完美,但当我返回它们时,我要么什么也得不到,要么得到了承诺 有人能告诉我检索和处理Elasticsearch数据的正确方法吗 我将VueJS与节点服务器和官方Elasticsearch包一起使用 function getNewTest(client) { client.search({ index: 'myI
function getNewTest(client)
{
client.search({
index: 'myIndex',
}).then(function(resp) {
return resp.hits.hits;
}, function(err) {
console.trace(err.message);
});
}
let tests = getNewTest(client);
console.log(tests);
# Output: Promise { <pending> }
将返回“未定义”给我。我将我的功能更改为:
async function getNewTest(client)
{
await client.search({
index: 'myIndex',
}).then(function(resp) {
console.log(resp.hits.hits, 'returned');
return resp.hits.hits;
}, function(err) {
console.trace(err.message);
});
}
我什么时候做
let test = getNewTest(client);
它给了我一个承诺
(async () => {
let tests = await getNewTest(client);
console.log(tests);
})();
您正在进行db调用,因此主线程变为空闲,并开始执行下一行。代码需要等待承诺得到解决,然后执行下一行
或者,如果您不想使用async Wait,您可以使用下面的代码-
async function getNewTest(client) {
client.search({
index: 'myIndex',
}).then(function (resp) {
return resp.hits.hits;
}, function (err) {
console.trace(err.message);
});
}
getNewTest(client).then(result => {
console.log(result);
});
函数getNewTest总是返回undefined,因为您没有显式返回任何内容 即使你是这样做的:
function getNewTest(client)
{
return client.search({
index: 'myIndex',
}).then(function(resp) {
return resp.hits.hits;
}, function(err) {
console.trace(err.message);
});
}
它将回报一个承诺
const generatePromise=()=>新承诺((解决,拒绝)=>{
设置超时(()=>{
决议(1500)
}, 500)
})
函数测试(){
返回生成器promise()
.then((数据)=>console.log('承诺解决后',数据))
.catch((err)=>console.log(err))
}
log('调用测试函数之前');
常量结果=测试()
log('调用测试函数后',Promise的结果实例)代码>执行此操作时:
async function getNewTest(client)
{
await client.search({
index: 'myIndex',
}).then(function(resp) {
console.log(resp.hits.hits, 'returned');
return resp.hits.hits;
}, function(err) {
console.trace(err.message);
});
}
这意味着:
async function getNewTest(client)
{
await client.search({
index: 'myIndex',
}).then(function(resp) {
console.log(resp.hits.hits, 'returned');
return resp.hits.hits;
}, function(err) {
console.trace(err.message);
});
return undefined; // you are deliberately returning undefined
}
请记住,在javascript中,如果不返回任何内容,则函数的结果是未定义的。我猜你打算做的是:
async function getNewTest(client)
{
return await client.search({ // NOTE THIS LINE
index: 'myIndex',
}).then(function(resp) {
console.log(resp.hits.hits, 'returned');
return resp.hits.hits;
}, function(err) {
console.trace(err.message);
});
}
由于.search()
已返回承诺(或类似承诺的对象),您无需等待它。上述代码与以下代码完全相同:
function getNewTest(client)
{
return client.search({ // NOTE THIS RETURN
index: 'myIndex',
}).then(function(resp) {
console.log(resp.hits.hits, 'returned');
return resp.hits.hits;
}, function(err) {
console.trace(err.message);
});
}
但是,这仍然不允许您执行let test=getNewTest(客户端)
任何事情都无法实现这一点。这简直是不可能的。要获得getNewTest()
的结果,可以调用它的。然后()
方法或等待它。换句话说,要么这样做:
getNewTest(client).then(function(test) { /*continue logic here*/ })
async function foo () {
let test = await getNewTest(client);
/*continue logic here*/
}
foo();
或者这样做:
getNewTest(client).then(function(test) { /*continue logic here*/ })
async function foo () {
let test = await getNewTest(client);
/*continue logic here*/
}
foo();
请注意,此机制适用于任何地方。这样做也是不可能的:
async function foo () {
let test = await getNewTest(client);
return test;
}
let test = foo();
如果你想走这条路线,你必须这样做:
async function foo () {
let test = await getNewTest(client);
return test;
}
async function bar () {
let test = await foo();
/*continue logic here*/
}
无法逃脱。您可以从不直接返回异步值 谢谢你的评论!我试过了,但不幸的是,我仍然收到了一个“未定义的”。稍后我将发布我的代码作为参考。我更改了我的主要帖子不需要使用let test=getNewTest(客户端),您已经在使用getNewTest(客户端).then(函数(响应){console.log(响应);});谢谢你的评论!我试过了,但不幸的是,我仍然收到了一个“未定义的”。稍后我会发布我的代码作为参考。我更改了我的主要帖子。我编辑了答案以使其更清晰,希望它能帮助您。