Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/40.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_Asynchronous - Fatal编程技术网

如何从javascript异步函数访问返回值

如何从javascript异步函数访问返回值,javascript,node.js,asynchronous,Javascript,Node.js,Asynchronous,我有一个Node.js函数从DB表中获取一些值 var GetPoints = function(ibmdb, dbConnection, msisdn) { ibmdb.open(dbConnection, function(err, conn) { if (err) { //Error } else { conn.query('SELECT id,msisdn,points FROM t_points W

我有一个Node.js函数从DB表中获取一些值

var GetPoints = function(ibmdb, dbConnection, msisdn) {
    ibmdb.open(dbConnection, function(err, conn) {
        if (err) {
            //Error
        } else {
            conn.query('SELECT id,msisdn,points FROM t_points WHERE msisdn =' + msisdn, function(err, data) {
                console.log(err);
                if (!err) {
                    conn.close(function(err) {
                        if (!err) {}
                    });
                    consele.log(data);
                    //return data[0].POINTS;
                } else {
                    //Error
                }
            });
        }
        console.log("points" + points);
    });
}
我想知道当我从外部调用此函数时,如何访问
数据
对象

 var data = GetPoints(ibmdb, dbConnection, msisdn);

当我执行
控制台时,值正确。log

您不能直接从异步函数返回值。在这种情况下,通常使用承诺。您返回一个承诺,该承诺可在以后调用
。然后
检索所述值

var Promise = require('bluebird');
var GetPoints = function(ibmdb, dbConnection, msisdn) {
    // return a Promise
    return new Promise(function(resolve){
        ibmdb.open(dbConnection, function(err, conn) {
            if(err) throw err; // throw the error for it to be caught
            …
            conn.query('SELECT …', function(err, data) {
                if(err) throw err;
                …
                consele.log(data);
                //return data[0].POINTS;
                resolve(data);
}); }); }); }

GetPoints().then(function(data){
    // do something with data
}).catch(function(err){
    // handle err
});
此外,Bluebird还有一个
promisify
函数,该函数将异步函数(接受回调)转换为返回承诺的函数。它使上述代码更加简单:

注意:虽然我不太情愿,因为如果您使用的是MySQL,那么Promission可能会有点棘手:。但现在我添加了
.promisifyAll
,它可能看起来是多余的,因为它可能会被执行多次,但希望bluebird的promisification足够聪明来处理这个问题。尽管如此,如果您能够更有效地promisify,您只需删除冗余的
promisifyAll
,然后使用
X.yyyanc
方法,如下所述:


不能直接从异步函数返回值。在这种情况下,通常使用承诺。您返回一个承诺,该承诺可在以后调用
。然后
检索所述值

var Promise = require('bluebird');
var GetPoints = function(ibmdb, dbConnection, msisdn) {
    // return a Promise
    return new Promise(function(resolve){
        ibmdb.open(dbConnection, function(err, conn) {
            if(err) throw err; // throw the error for it to be caught
            …
            conn.query('SELECT …', function(err, data) {
                if(err) throw err;
                …
                consele.log(data);
                //return data[0].POINTS;
                resolve(data);
}); }); }); }

GetPoints().then(function(data){
    // do something with data
}).catch(function(err){
    // handle err
});
此外,Bluebird还有一个
promisify
函数,该函数将异步函数(接受回调)转换为返回承诺的函数。它使上述代码更加简单:

注意:虽然我不太情愿,因为如果您使用的是MySQL,那么Promission可能会有点棘手:。但现在我添加了
.promisifyAll
,它可能看起来是多余的,因为它可能会被执行多次,但希望bluebird的promisification足够聪明来处理这个问题。尽管如此,如果您能够更有效地promisify,您只需删除冗余的
promisifyAll
,然后使用
X.yyyanc
方法,如下所述:



异步执行SQL查询后提供的回调函数。与其尝试在函数外部获取数据,不如尝试在函数内部执行任何需要执行的操作。请记住,您可以创建另一个函数并使用数据调用它以继续您的工作

异步执行SQL查询后提供的回调函数。与其尝试在函数外部获取数据,不如尝试在函数内部执行任何需要执行的操作。请记住,您可以创建另一个函数并使用数据调用它以继续您的工作

没有返回数据不起作用..我确实想在line console.log(数据)之后使用返回数据。但该值似乎仅对内部函数的上下文有效,您指的是异步函数,即
conn.query
的回调函数?不幸的是,你不能。您的
数据
仅在该回调内可用。我无法获取数据[0]。指向上下文之外的点?请使用返回值指定一个范围之外的变量。花一点时间检查变量,如果设置了,就做些什么。问题是执行查询后数据可用。但GetPoints在查询启动时返回。所以您可以将数据存储在某个位置,等待查询完成或在回调中使用它。没有返回数据不起作用。.我确实希望在line console.log(data)之后使用返回数据。但该值似乎仅对内部函数的上下文有效,您指的是异步函数,即
conn.query
的回调函数?不幸的是,你不能。您的
数据
仅在该回调内可用。我无法获取数据[0]。指向上下文之外的点?请使用返回值指定一个范围之外的变量。花一点时间检查变量,如果设置了,就做些什么。问题是执行查询后数据可用。但GetPoints在查询启动时返回。因此,您可以将数据存储在某个位置,等待查询完成或在回调中使用它。Bluebird的
promisify
函数可能在这里使用,以避免直接创建新的承诺(这通常是不需要的,而且容易出错)。@MattHamann精彩的一点。我自己也喜欢Promission,但在这种情况下我很不情愿,因为我发现使用MySQL可能有点棘手:。尽管如此,我还是扩展了Promission部分和mysql的相关问题。我还纠正了没有抛出错误的错误(希望这是唯一的错误)。我所能返回的只是promisify对象。Bluebird的
promisify
函数可能在这里使用,以避免直接创建新的承诺(通常不需要,而且容易出错)。@MattHamann极好的观点。我自己也喜欢Promission,但在这种情况下我很不情愿,因为我发现使用MySQL可能有点棘手:。尽管如此,我还是扩展了Promission部分和mysql的相关问题。我还纠正了没有抛出错误的错误(希望这是唯一的错误)。我能返回的只是promisify对象。