如何将嵌套回调转换为promises

时间:2018-04-10 06:20:46

标签: javascript node.js callback promise

我有嵌套引起问题的回调。我想改变承诺,但我不确定如何做到这一点。

我首先得到一个输出数组

require('abcd').open(cnnectionString, function(er, conn) {  
    // I get list back from following query
   conn.query('select first 10 name, phone from........', function(err, result) {
       if(err) {
       } else {
           // for each name and phone I call another query
           for(i = 0; i <= result.length; i++) {
                conn.query('select address from......where name=result[i].name',  
                function(error, result1) {
                     // I call third query based on data from second query
                     conn.query('select acct from .......where ', function(err, result2) { 
                          console.log(result2)
                     })  
                })                
           })
})

通过这种方法,由于异步,我得到了各种糟糕的结果。请让我知道如何将其改为承诺。

2 个答案:

答案 0 :(得分:1)

您可以使用Promise.all()实现此目的,请稍后查看并尝试一下:

var connection;
var promises = [];
require('abcd').open(cnnectionString)
  .then(function(conn) {
    connection = conn;
    return connection.query('select first 10 name, phone from........');    
  })
  .then(function(result) {
    for (i=0; i<=result.length; i++) {
      var promise = connection.query('select address from......where name=result[i].name');      
      promises.push(promise);
    }    
  })
  .catch(function(err) {
    console.log(err, 'error');
  });

Promise.all(promises).then(function(result) {
  console.log(result, 'result');
});

答案 1 :(得分:0)

以下代码可以帮助您了解如何在代码中将回调更改为承诺

var name = require('abcd');
name.open(connectionString)
.then(function(conn) {
    //query
   })
.then(function(other) {
   })
});

你可以通过这些链接了解nodejs中的promises,也有一些例子 https://developer.ibm.com/node/2016/08/24/promises-in-node-js-an-alternative-to-callbacks/ https://www.guru99.com/node-js-promise-generator-event.html