NodeJS来自函数的回调

时间:2018-03-29 10:12:02

标签: node.js express callback

我是NodeJS / Express的新手,并尝试了解回调函数。

我有一个Query的函数,它生成一个数组:

while (s.good()) {
    // process.
}

在数组中我有“facil”,我想通过调用en外部函数进行设置。

conn.query('SELECT * FROM clients', function(err, rows, fields) {
        if (err) {
            res.status(500).json({"status_code": 500,"status_message": "internal server error"});
        } else {
            // Loop check on each row
            for (var i = 0; i < rows.length; i++) {
                var person = {
                     'fullname':rows[i].fullname,
                     'address1':rows[i].address,
                     'city':rows[i].city,
                     'facil': docall(rows[i].clientId, conn, respons)
                }
                // Add object into array
                clientList.push(person);
        }

        // Render index.pug page using array 
        res.render('clients', {"clientList": clientList, testVar});
        }
    });

}

问题是我没有将值恢复为未定义。由于代码的异步运行。

但我怎么做呢???

如何通过调用另一个函数来设置数组中的值facil?

2 个答案:

答案 0 :(得分:0)

您正在返回回调函数,然后尝试将其存储在facil属性中,请尝试此操作

conn.query('SELECT * FROM clients', function (err, rows, fields) {
  if (err) {
    res.status(500).json({
      "status_code": 500,
      "status_message": "internal server error"
    });
  } else {
    // Loop check on each row
    for (var i = 0; i < rows.length; i++) {
      doCall(rows[i].clientId, conn, function (err, respDocall) {
        if (err) {
          res.status(500).json(err);
        }else{
          var person = {
                 'fullname':rows[i].fullname,
           'address1':rows[i].address,
           'city':rows[i].city,
           'facil': respDocall
          }
          clientList.push(person);
        }
      });
      // Add object into array
    }

    // Render index.pug page using array 
    res.render('clients', {
      "clientList": clientList,
      testVar
    });
  }
});



function doCall(id, conn, callback) {
  conn.query('SELECT COUNT(clientId) AS Antal  FROM facility WHERE clientId =' + id, function (err, rows, fields) {
    if (err) {
      return callback({
        "status_code": 500,
        "status_message": "internal server error"
      });
    } else {
      return callback(rows[0].Antal);
    }
  })
}

答案 1 :(得分:0)

您需要像这样在第二个函数上编写回调函数。以下是async库的实现。

conn.query('SELECT * FROM clients', function(err, rows, fields) {

        if (err) {
            res.status(500).json({"status_code": 500,"status_message": "internal server error"});
        } else {

            async.eachSeries(rows,function(item,callback){

                conn.query('SELECT COUNT(clientId) AS Antal  FROM facility WHERE clientId =' +id, function(err, result, fields) {
                    if (err) {
                        return res.status(500).json({"status_code": 500,"status_message": "internal server error"});
                    } else {

                             var person = {
                            'fullname':item[i].fullname,
                            'address1':item[i].address,
                            'city':item[i].city,
                            'facil': result[0].Antal
                        }
                        clientList.push(person);
                        callback()
                    }
                });

            },function(){
                //final callback here
                res.render('clients', {"clientList": clientList, testVar});
            })
        }

})