javascript - 如何使用嵌套promise调用函数并获取值

标签 javascript node.js asynchronous promise

我是异步调用和 promise 的新手。我想调用三个调用数据库的函数。我需要得到这些结果并对其进行处理。我用 Promise 来实现它。它不起作用,因为我想我一定没有采取正确的方式,请提出建议。感谢您的任何回答。我在 NODE JS 中使用。 数据库函数似乎可以工作,它通过三个查询调用数据库。

代码

function nested_three_Promise_call_three_function(){
    new Promise(function (resolve, reject) { return sample(); })
        .then(
        function (val) {
            new Promise(function (resolve, reject) { sample1(); })
                .then(
                function (val) {
                    new Promise(function (resolve, reject) { sample2(); })
                        .then({
                            function(val) {
                                /* NEED TO GET VALUE OF ALL SAMPLE,SAMPLE1,SAMPLE 2 FOR FURTHER PROCESS BEFORE SEND TO RESPONSE*/
                                console.log("sample" + sample);
                                console.log("sample1" + sample1);
                                console.log("sample2" + sample2);
                            },
                            function(err){
                                console.log("error inside promise for sample2");
                            }
                        })
                },
                function (err) { 
                    console.log("error inside promise for sample1");
                }
            )
        }, 
        function (error) { 
            console.log("error inside promise for sample1");
        });
}

function sample() {
    console.log("sample called");
    database.query("select * from sample").then(function(result){
        sample  = result;
    }).catch(function(error){
        console.log("error occured in sample")
    });

}
function sample1() {
     console.log("sample called");
    database.query("select * from sample1").then(function(result){
        sample1  = result;
    }).catch(function(error){
        console.log("error occured in sample1")
    });
}
function sample2() {
     console.log("sample called");
    database.query("select * from sample2").then(function(result){
        sample2  = result;
    }).catch(function(error){
        console.log("error occured in sample2")
    });
}

最佳答案

这里有几个问题:

  1. 您的 sampleX 函数不会返回任何内容。

  2. 您的 sampleX 函数应该只返回 promise query 返回的内容。

  3. 您创建了不必要的 promise 。

所以首先要做的就是改变:

function sample() {
    console.log("sample called");
    database.query("select * from sample").then(function(result){
        sample  = result;
    }).catch(function(error){
        console.log("error occured in sample")
    });
}

至:

function sample() {
    console.log("sample called");
    return database.query("select * from sample");
}

...对于 sample1sample2 也类似。

如果,正如您问题中的代码所建议的,没有一个函数使用其他函数的结果,您可以使用 Promise.all:

function nested_three_Promise_call_three_function() {
    Promise.all([sample(), sample1(), sample2()])
        .then(function(results) {
            // Use results[0], results[1], and results[2] here
            console.log("From sample:",  results[0]);
            console.log("From sample1:", results[1]);
            console.log("From sample2:", results[2]);
        })
        .catch(function(error) {
            // Something went wrong
        });
}

function sample() {
    console.log("sample called");
    return database.query("select * from sample");
}
function sample1() {
    console.log("sample called");
    return database.query("select * from sample1");
}
function sample2() {
    console.log("sample called");
    return database.query("select * from sample2");
}

数据库调用将并行运行,完成后您将获得结果。

<小时/>

如果它们都需要前一个的结果,而你只需要最后的最终结果,那么你可以将它们链接起来;在下面,请注意 sample1sample2 现在接受参数:

function nested_three_Promise_call_three_function() {
    sample()
        .then(sample1)
        .then(sample2)
        .then(function(result) {
            // `result` is the result from sample2
        })
        .catch(function(error) {
            // Something went wrong
        });
}

function sample() {
    console.log("sample called");
    return database.query("select * from sample");
}
function sample1(arg) {
    console.log("sample called");
    // use arg here
    return database.query("select * from sample1");
}
function sample2(arg) {
    console.log("sample called");
    // use arg here
    return database.query("select * from sample2");
}
<小时/>

如果您需要将先前的结果传递到后续函数并且最后得到所有结果,您可能有多种选择,但首先想到的就是跟踪他们是您调用电话的地方:

function nested_three_Promise_call_three_function() {
    let sampleResult, sample1Result;
    sample()
        .then(function(result) {
            sampleResult = result;
            return sample1(result);
        })
        .then(function(result){
            sample1Result = result;
            return sample2(result);
        })
        .then(function(sample2Result) {
            // `sampleResult`, `sample1Result`, and `sample2Result` have the results here
        })
        .catch(function(error) {
            // Something went wrong
        });
}

function sample() {
    console.log("sample called");
    return database.query("select * from sample");
}
function sample1(arg) {
    console.log("sample called");
    // use arg here
    return database.query("select * from sample1");
}
function sample2(arg) {
    console.log("sample called");
    // use arg here
    return database.query("select * from sample2");
}

关于javascript - 如何使用嵌套promise调用函数并获取值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38934086/

相关文章:

javascript - 什么是 FORM 等同于 DOM 的 getNextSibling?

javascript - 在 Node.js 中验证 URL 查询字符串

javascript - Photoshop CC Javascript - 翻转图层/图像

node.js - 如何从docker容器获取 Node 版本?

node.js - 准备要分发的node_modules 吗?

Node.JS 在 SELinux 沙箱中生成

javascript - 如何使用 Vue.js 对表格列进行排序?

javascript - 如何从 setInterval 函数返回值?

javascript - 如何在 Node 中完成第一个异步并行任务时结束?

node.js - forEach 中的 Puppeteer 测试