Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vue.js/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js NodeJS Elasticsearch返回承诺而不是值_Node.js_Vue.js_<img Src="//i.stack.imgur.com/RUiNP.png" Height="16" Width="18" Alt="" Class="sponsor Tag Img">elasticsearch - Fatal编程技术网 elasticsearch,Node.js,Vue.js,elasticsearch" /> elasticsearch,Node.js,Vue.js,elasticsearch" />

Node.js NodeJS 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

我在我的节点服务器中请求Elasticsearch。这是完美的工作,除了我总是得到一个承诺而不是结果返回

当我记录结果时,它们看起来很完美,但当我返回它们时,我要么什么也得不到,要么得到了承诺

有人能告诉我检索和处理Elasticsearch数据的正确方法吗

我将VueJS与节点服务器和官方Elasticsearch包一起使用

    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(响应);});谢谢你的评论!我试过了,但不幸的是,我仍然收到了一个“未定义的”。稍后我会发布我的代码作为参考。我更改了我的主要帖子。我编辑了答案以使其更清晰,希望它能帮助您。