Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 从作为参数传递的匿名函数返回_Javascript_Node.js_Anonymous Function - Fatal编程技术网

Javascript 从作为参数传递的匿名函数返回

Javascript 从作为参数传递的匿名函数返回,javascript,node.js,anonymous-function,Javascript,Node.js,Anonymous Function,考虑以下代码: function dbTask(q) { mysql = new MySQL(); mysql.host = sqlHost; mysql.user = sqlUser; mysql.password = sqlPassword; mysql.query("USE stock"); return mysql.query(q, function(err, results, fields) { if(err) {

考虑以下代码:

function dbTask(q) {
    mysql = new MySQL();
    mysql.host = sqlHost;
    mysql.user = sqlUser;
    mysql.password = sqlPassword;
    mysql.query("USE stock");

    return mysql.query(q, function(err, results, fields) {
        if(err) {
            console.log("MySQL Error: " + err + ", Query: " + q);
            return false;
        } else {
            return results; //here
        }
    });
};

var r = dbTask("SELECT * FROM user;");
console.log(r);
然而,我希望在最后第二行调用dbTask时从内部匿名函数返回结果,我得到了不同的输出,这似乎是正在使用的mysql库的一些内部构造

如何让dbTask在调用时返回结果?

因为mysql.query是异步的,所以您必须重新考虑您的体系结构

如果查询返回true或false,则必须传入要调用的处理程序,而不是让函数返回true或false

大概是这样的:

function dbTask(q, success, failure) {
    mysql = new MySQL();
    mysql.host = sqlHost;
    mysql.user = sqlUser;
    mysql.password = sqlPassword;
    mysql.query("USE stock");

    mysql.query(q, function(err, results, fields) {
        if(err) {
            console.log("MySQL Error: " + err + ", Query: " + q);
            failure(err, results, fields);
        } else {
            success(results, fields);
        }
    });
};
dbTask(q, 
          function(results, fields) { /* ... */ }, 
          function(err, results, fields) { /* ... */ });
你可以这样称呼它:

function dbTask(q, success, failure) {
    mysql = new MySQL();
    mysql.host = sqlHost;
    mysql.user = sqlUser;
    mysql.password = sqlPassword;
    mysql.query("USE stock");

    mysql.query(q, function(err, results, fields) {
        if(err) {
            console.log("MySQL Error: " + err + ", Query: " + q);
            failure(err, results, fields);
        } else {
            success(results, fields);
        }
    });
};
dbTask(q, 
          function(results, fields) { /* ... */ }, 
          function(err, results, fields) { /* ... */ });
因为mysql.query是异步的,所以您必须重新考虑您的体系结构

如果查询返回true或false,则必须传入要调用的处理程序,而不是让函数返回true或false

大概是这样的:

function dbTask(q, success, failure) {
    mysql = new MySQL();
    mysql.host = sqlHost;
    mysql.user = sqlUser;
    mysql.password = sqlPassword;
    mysql.query("USE stock");

    mysql.query(q, function(err, results, fields) {
        if(err) {
            console.log("MySQL Error: " + err + ", Query: " + q);
            failure(err, results, fields);
        } else {
            success(results, fields);
        }
    });
};
dbTask(q, 
          function(results, fields) { /* ... */ }, 
          function(err, results, fields) { /* ... */ });
你可以这样称呼它:

function dbTask(q, success, failure) {
    mysql = new MySQL();
    mysql.host = sqlHost;
    mysql.user = sqlUser;
    mysql.password = sqlPassword;
    mysql.query("USE stock");

    mysql.query(q, function(err, results, fields) {
        if(err) {
            console.log("MySQL Error: " + err + ", Query: " + q);
            failure(err, results, fields);
        } else {
            success(results, fields);
        }
    });
};
dbTask(q, 
          function(results, fields) { /* ... */ }, 
          function(err, results, fields) { /* ... */ });
不能这样做,因为一旦mysql.query调用完成,dbTask就会返回以启动查询。因此,在调用mysql.query的回调时,console.logr已经执行

这是node.js异步特性的关键

您可以让dbTask接受一个回调参数,一旦结果可用,函数就会调用该参数,以便异步地将其提供给调用方。

您不能接受,因为dbTask在mysql.query调用完成后返回以启动查询。因此,在调用mysql.query的回调时,console.logr已经执行

这是node.js异步特性的关键

您可以做的是让dbTask接受一个回调参数,一旦结果可用,函数就会调用该参数,以便可以异步地将其提供给调用方