2016-08-13 12 views
0

私は非同期呼び出しと約束を新しくしました。私はデータベースを呼び出す3つの関数を呼び出すしたい。私はそれらの結果を得てそれを処理する必要があります。私はそれを約束します。私は正しいことをしてはならないと思っているので、それはうまくいかない。あなたの答えは高く評価されます。私はNODE JSで使用しています。 データベース機能が3つのクエリでデータベースを呼び出すように見えます。ネストされた約束を使用して関数を呼び出して値を取得する方法

CODE

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

'database.query()'、すでに約束を返しているように見えるので、すべてはかなり無意味と思われますy (sample1).then(sample2).then(... ' – adeneo

+0

@adeneo私はあなたが本当にすべての人に新しい時代になって少しずつ喜んでくれてありがとうと思いますか?この。 – aka

+0

質問で 'new Promise(function(resolve、reject){}) 'の' javascript'で 'resolve'が呼び出されていないようですか? 'nested_three_Promise_call_three_function()'は解決または拒否された約束の値または理由を返しませんか? – guest271314

答えて

2

があるいくつかの問題があります。

  1. あなたsampleX関数は何も返しません。

  2. あなたのsampleX関数は、約束を返すだけでqueryが返されます。

  3. あなたは約束を不必要に作成しています。

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

それはPromise.Allについて文句を言って、そのキーワードを認識しません。 – aka

+0

@aka:JavaScriptでは大文字と小文字が区別されます:それは 'Promise.all'ではなく' Promise.All'です。 –

+0

私は同じPromise.Allを持っています。あなたが投稿した正確なものをコピーしました。 – aka

関連する問題