从nodejs中的函数返回数组

时间:2018-05-29 10:05:26

标签: node.js

我有这两个功能

这里我从销售表中获取详细信息

   var getLedgerDetails = function (name, id, res) {
    var response = [];
    var f = '%d %b %Y';
    connection.query("SELECT id,voucher_type,DATE_FORMAT(date,?) as date,amount,voucher_number FROM sales WHERE ledger_name=? and company_id=?", [f, name, id], function (err, result) {
        if (err) {
            console.log(err)
        }
        else {
            if (result.length > 0) {
                var r = JSON.stringify(result, null, 2);
                var row = JSON.parse(r);
                return row[0];
            }
            else {

            }
        }
    })
};

,第二个是

这里我想访问getLedgerDetails函数

getDetails=function(name,id,res){

            //**returns undefined**
             console.log(getLedgerDetails(name,id,res)); 
             }

但它返回undefined ..它使函数调用但不返回任何值 哪里我错了?

2 个答案:

答案 0 :(得分:0)

因为你的代码是异步的,你必须在回调函数中返回你的数据,这个函数只会在最后调用。

您可以尝试这样的事情:

var getLedgerDetails=function(name,id,res, callback) {
        var response = [];
        var f = '%d %b %Y';
        connection.query("SELECT id,voucher_type,DATE_FORMAT(date,?) as date,amount,voucher_number FROM sales WHERE ledger_name=? and company_id=?", [f, name, id], function (err, result) {
            if (err) {
                callback(err, null);
            }
            else {
                if (result.length > 0) {
                    var r = JSON.stringify(result, null, 2);
                    var row = JSON.parse(r);
                    callback(null, row[0]);
                }
                else {
                    callback(null, null);
                }
            }
        });
    };

你的getDetails函数

getDetails=function(name,id,res){

    getLedgerDetails(name, id, res, function(err, row) {
        if (err) {
            console.log(err);
        }
        else {
            console.log(row);
        }
    });
};

答案 1 :(得分:0)

您似乎希望函数getLedgerDetails返回数据,而与connection.query函数关联的匿名函数实际上正在返回您的数据。作为javascript的异步性质 在您的情况下,您可以使用Promises。

嗯,Promise为我们提供了更清晰的代码,并且使用promises处理错误非常容易。此外,在处理一个接一个的嵌套回调时,promises会更好。

对于承诺:

var Promise = require('promise');


var getLedgerDetails=function(name,id,res) {

    return new Promise(function (resolve, reject) { 
         var response=[];
         var f='%d %b %Y';
         connection.query("SELECT id,voucher_type,DATE_FORMAT(date,?) 
              as date,amount,voucher_number FROM sales WHERE 
              ledger_name=? and 
              company_id=? ,[f,name,id],function(err,result){
             if(err){
                reject(err);//or any custom error message.
             }else {
                if(result.length>0){
                    var r=JSON.stringify(result,null,2);
                    var row=JSON.parse(r);
                    resolve(row[0]);
                }else{

                }
            }
      });
    }

}

用法:

getLedgerDetails.then(function(success){
   console.log(success)// your db data.
}).catch(function(error) {
    // error handle    
});
相关问题