猿问

如何使用 Node/JS 从异步回调方法中正确获取数据?

如果这已经被问了一百次,真的很抱歉,但我无法适应我发现的任何以前的 SO 解决方案来解决我的问题。其中很多都是特定于 Ajax 的。


我是 Node 异步回调的新手,因此我遇到了从异步回调正确“返回”数据的问题。在我的示例中,我试图返回CharList. SQL 查询和数据都是有效的,所以这些都不太重要。


我试过简单地返回值,我很快了解到这是不可能的,并且违背了异步回调的目的。


编辑:我还尝试CharList在函数外部定义,然后通过函数分配值,但CharList在函数完成后记录会打印一个空数组。


// index.js

const sql = require('./sql')

const query = require('./queries');


function AllCharsToArray() {

    query.character.GetAllChars(function(result) {

        let CharList = [];

        for (var i in result) {

            CharList.push(result[i]._Name)

        }

    })

}


/*

{

    "characters":

    [

        {"_Name":"Charname 1"},

        {"_Name":"Charname 2"},

        {"_Name":"Charname 3"}

    ]

}

*/

// queries.js

const mysql = require('mysql');

const sql = require('./sql')


function GetAllChars(callback) {

    sql.conn.query(`SELECT _Name FROM characters;`, function(error, results, fields) {

        return callback(results); // returns RowDataPacket

    })

}


exports.character = {

    GetAllChars: GetAllChars,

}

最终,我试图在CharList外部可用,AllCharsToArray以便我可以将它们导出到 express.js 路由。


萧十郎
浏览 133回答 2
2回答

牧羊人nacy

建议的回调函数包含错误信息,如// queries.jsconst mysql = require('mysql');const sql = require('./sql')function GetAllChars(callback) {    sql.conn.query(`SELECT _Name FROM characters;`, function(error, results, fields) {        // change as        if(error) {            return callback(error)        }        callback(null,results); // returns RowDataPacket    })}exports.character = {    GetAllChars: GetAllChars,}在 index.js 上...function(req,res){    query.character.GetAllChars(function(err,data){       // check error info       if(err){          // console.debug(err)          return res.send(err.message)       }       res.json(data)    })}...

喵喔喔

将 CharList 放在 AllCharsToArray() 之外// index.jsconst sql = require('./sql')const query = require('./queries');query.character.GetAllChars(function(result) {    const CharList = [];    for (var i in result) {        CharList.push(result[i]._Name);    }    // launch the route after GetAllChars is done    expressApp.get('getCharList', (req, res) => {        res.json(CharList);    });});
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答