2016-08-13 2 views
0

Я новичок в асинхронном вызове и обещании. Я хочу вызвать три функции, которая вызывает базу данных. Мне нужно получить эти результаты и обработать их. я использую для этого обещание. это не работает, поскольку я думаю, что я, должно быть, не делаю правильный путь, пожалуйста, предложите. ваш любой ответ приветствуется. Я использую в 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

'database.query()', кажется, уже возвращаются обещание, так что все это кажется довольно бессмысленным когда у ou может просто вернуть это значение и сделать что-то более похожее на 'sample(). then (sample1) .then (sample2) .then (...' – adeneo

+0

@adeneo Я бы хотел, чтобы вы, пожалуйста, выделили немного больше, поскольку я действительно новичок во всем это. – aka

+0

'' '' '' '' '' не вызывается в 'javascript' в' new Promise (функция (разрешить, отклонить) {}) 'at Question? '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"); 
} 

... и аналогично для sample1 и sample2.

Если, как это было предложено код в ваш вопрос, ни одна из функций не использует результат какой-либо из других, они вы можете использовать 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"); 
} 

Вызовы базы данных будут работать параллельно, и то вы получите результат, когда все будет готово.


Если каждый из них нужен результат предыдущего, и вам нужно только конечный результат в конце, то вы приковать их; в ниже, обратите внимание, что 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"); 
} 
+0

он жалуется на Promise.All, он не узнает, что ключевое слово – aka

+0

@aka: Дело имеет значение в JavaScript: это 'Promise.all', а не' Promise.All'. –

+0

У меня есть тот же Promise.All. я скопировал то, что вы отправили. – aka

Смежные вопросы