2016-08-13 2 views
0

비동기 호출과 약속을 처음 사용합니다. 나는 데이터베이스를 호출하는 세 가지 함수를 호출하려고합니다. 그 결과를 얻고 처리해야합니다. 나는 그것을 약속한다. 그것은 내가 올바른 길을 제시하지 말아야한다고 생각하고 있기 때문에 효과가 없습니다. 귀하의 모든 대답을 부탁드립니다. 나는 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 ou는 그것을 반환 할 수 있고,'sample(). then (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에 대한

그래서 할 수있는 첫번째 것은 변화이다.

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

데이터베이스 호출을 병렬로 실행되며, :, 질문의 코드에 의해 제안, 기능 중 어느 것도 다른 사람의 결과를 사용하지 않는 경우

, 그들은 당신이 Promise.all 사용할 수 있습니다 모두 완료되면 결과를 얻을 수 있습니다.


각각 이전 결과를 필요로하고 끝에 최종 결과 만 필요하면 체인을 연결해야합니다. 아래에, 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에 대해 불평합니다. 키워드가 인식되지 않습니다. – aka

+0

@aka : JavaScript에서 대소 문자가 중요합니다. Promise.all이 아닌 Promise.all입니다. –

+0

전 Promise.All과 같습니다. 나는 당신이 올린 정확한 것을 복사했다. – aka

관련 문제