Javascript:将参数传递给回调函数

时间:2017-05-22 17:44:00

标签: javascript callback

我想在此数据库查询中调用返回数据的函数,如下面的代码段所示。

function connectDB(query, data, callback) {
    pg.connect(process.env.DATABASE_URL, function (err, client) {
        if (err) {
            console.log(err);
        } else {
                client
                    .query(query, data, function (err, result) {
                        callback(result.rows);                            
                    });
        }
     }
}

function foo(data) {
  connectDB("SELECT * FROM mytable WHERE id=$1", someID, callbackfn(data));
}

我不知道如何编写callbackfn,以便我可以使用原始函数中的数据和db结果中的行。

function callbackfn(data) {
  return function(rows) {
   // Do something with rows and data
  }
}

3 个答案:

答案 0 :(得分:0)

你不接受任何具有回调功能的参数。怎么样:

function callback(rows) {
  /* not sure what your intention was here? nested functions? */
  return function () {
    return function () {
        // Do something with rows
    }
  }
}

要明确的是,您可以发布您调用connectDB函数的位置吗?由于callback是传递给connectDB后的变量的名称。

答案 1 :(得分:0)

为什么要定义回调函数?请详细说明。另外,请尝试像这样调用connectDB

 connectDB(query, data, function(rows) {
       // Do something with rows
 });

在回调中阅读此answer

答案 2 :(得分:0)

您拥有令人难以置信的嵌套功能。此外,您将回调定义为参数,但如果您没有调用基函数再次传递“回调”作为参数,则它不会采用您定义的回调函数。 如果你想总是传递相同的回调,你提供它作为参数是没有意义的,你可以直接在你的“connectDB”函数中调用“回调”。此外,您的回调返回一个函数,因此应该再次使用()调用它。 然后你的主回调函数需要从外部接受行作为参数。 我使用callback参数保留了你的代码,因为我“希望”同一个名字只是一个例子来解释你想要每次都提供一个函数来操作你想要的行。 您的代码应如下所示:

function connectDB(query, data, callback) {
    pg.connect(process.env.DATABASE_URL, function (err, client) {
        if (err) {
            console.log(err);
        } else {
                client
                    .query(query, data, function (err, result) {
                        // this returns a function so it needs to be called again
                        callback(result.rows)();                            
                    });
        }
     }
}

// third inner function was useless
function callback(rows) {
  return function () {
    // Do something with rows
  }
}

// the third parameter HAS TO BE callback, otherwise you will not pass the function you defined. 
connectDB(query, data, callback);