Javascript 如何使用嵌套承诺调用函数并获取值

Javascript 如何使用嵌套承诺调用函数并获取值,javascript,node.js,asynchronous,promise,Javascript,Node.js,Asynchronous,Promise,我不熟悉异步调用和承诺。我想调用三个调用数据库的函数。我需要得到这些结果并加以处理。我用承诺来实现它。它不工作,因为我认为我一定没有做正确的方式请建议。如蒙答复,不胜感激。我在NodeJS中使用。 数据库函数似乎在工作,它通过三个查询调用数据库 代码 这里有几个问题: 您的sampleX函数不会返回任何内容 您的sampleX函数应该只返回承诺queryreturns 你在不必要地做出承诺 因此,首先要做的是改变: function sample() { console.log("sam

我不熟悉异步调用和承诺。我想调用三个调用数据库的函数。我需要得到这些结果并加以处理。我用承诺来实现它。它不工作,因为我认为我一定没有做正确的方式请建议。如蒙答复,不胜感激。我在NodeJS中使用。 数据库函数似乎在工作,它通过三个查询调用数据库

代码


这里有几个问题:

  • 您的
    sampleX
    函数不会返回任何内容

  • 您的
    sampleX
    函数应该只返回承诺
    query
    returns

  • 你在不必要地做出承诺

  • 因此,首先要做的是改变:

    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")
        });
    }
    
    致:

    …同样,对于
    sample1
    sample2

    如果按照问题中代码的建议,没有任何函数使用其他函数的结果,则您可以使用
    Promise。所有

    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");
    }
    
    数据库调用将并行运行,当它们全部完成时,您将得到结果


    如果它们都需要上一个的结果,而您只需要最后的结果,那么您可以将它们链接起来;在下面的示例中,请注意
    sample1
    sample2
    现在接受一个参数:

    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");
    }
    

    这里有几个问题:

  • 您的
    sampleX
    函数不会返回任何内容

  • 您的
    sampleX
    函数应该只返回承诺
    query
    returns

  • 你在不必要地做出承诺

  • 因此,首先要做的是改变:

    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")
        });
    }
    
    致:

    …同样,对于
    sample1
    sample2

    如果按照问题中代码的建议,没有任何函数使用其他函数的结果,则您可以使用
    Promise。所有

    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");
    }
    
    数据库调用将并行运行,当它们全部完成时,您将得到结果


    如果它们都需要上一个的结果,而您只需要最后的结果,那么您可以将它们链接起来;在下面的示例中,请注意
    sample1
    sample2
    现在接受一个参数:

    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");
    }
    

    database.query()
    似乎已经在返回一个承诺,所以当您可以返回承诺,并执行类似于
    sample().then(sample1.then(sample2.then)的操作时,这一切似乎都是毫无意义的(…
    @adeneo我很感激你能多给我一点时间,因为我对这一切都很陌生。
    resolve
    javascript
    at
    newpromise(function(resolve,reject){})
    在疑问中?
    嵌套的三个承诺调用三个函数()
    不会返回已解决或被拒绝的承诺值或原因?
    数据库.query()
    似乎已经在返回承诺,因此当您可以返回承诺并执行类似于
    sample()的操作时,这一切似乎都是毫无意义的。然后(sample1)。然后(sample2)。然后(…
    @adeneo我很感激你能多给我一点时间,因为我对这一切都很陌生。
    resolve
    javascript
    at
    newpromise(function(resolve,reject){})
    在疑问中?
    嵌套的三个承诺调用三个函数()
    不会返回已解决或拒绝的承诺值或原因?它会抱怨承诺。但它不承认这一点keyword@aka:大小写在JavaScript中很重要:它是
    Promise.all
    ,而不是
    Promise.all
    。我有相同的Promise.all。我完全复制了你发布的内容。@aka:你又说了
    Promise.all
    。它是
    Promise.all
    。小写
    a
    。如果您使用的是ES2015(也称为“ES6”)promises(从v6开始内置到NodeJS中,可能更早),然后,
    Promise。所有的
    都将是一个函数。如果你在使用其他东西,你应该提到。甚至=>这个符号没有识别它。我没有使用escma 6。请你建议我如何重写和使用新的Promise我需要写新的Promise吗。allit抱怨Promise。它都没有识别keyword@aka:Case在JavaScript中很重要:它是
    Promise.all
    ,而不是
    Promise.all
    。我有相同的Promise.all。我完全复制了你发布的内容。@aka:你说的是
    Promise.all
    。它是
    Promise.all
    。小写的
    a
    。如果你使用的是ES2015(aka“ES6”)promission(从v6开始内置到NodeJS,可能更早),然后
    Promise。所有的
    都将是一个函数。如果您正在使用其他东西,您应该提到这一点。甚至=>这个符号没有识别它。我没有使用escma 6。请您建议我如何重写和使用新的Promise。我需要编写新的Promise吗