Array push在promise node.js中不起作用

编程入门 行业动态 更新时间:2024-10-09 06:27:27

Array push在promise node.js<a href=https://www.elefans.com/category/jswz/34/1771233.html style=中不起作用"/>

Array push在promise node.js中不起作用

我以前曾尝试将此代码包装在回调中,使该语言必须提供的内容保持异步。但是,我仍然一无所获。

问题是,即使应随同信息一起推送,成员仍为空。频道,但是效果很好。

很奇怪,

console.log(values);

[之前的打印

console.log(result);

虽然很有趣,

console.log(result)

有正确的数据,但我在哪里

console.log(members)

它是空的。

我已经测试过,查询都是正确的,从字面上看是推送和获取结果的问题早于当前返回的问题(我以为Promises意味着事情会更加有序,但也许我的理解是错误的) 。

这里是完整代码:

module.exports.controller = (query, helper, cache, Database, mysql, config) => {
return async (req, res) => {

    let zone = req.body.zone;
    let returning = {};

    if(!zone){
        return res.json(helper.responseJson(false, 'Missing parameter "zone"'));
    }

    function teleport_available(channel_name){
        if(channel_name.indexOf("Nadaj / Usuń") === -1){
            return true;
        }else{
            return false;
        }
    }

    await mysql.query("SELECT * FROM flamespeak_pbot.zones WHERE zone = '"+ zone +"'", async (err, row) => {
        if (err) throw err;
        row = row[0];
        if (row.length == 0) {
            return res.json(helper.responseJson(false, "Zone not found."));
        } else {

            var channelsPromise = new Promise((resolve, reject) => { 
                const channels = [];
                JSON.parse(row.assignGroupAdditional_ch).forEach(additionalCh => {
                    cache.channelList.filter(channel => channel.cid == additionalCh).forEach(mainCh => {
                        mainCh.propcache.teleport_available = teleport_available(mainCh.propcache.channel_name);
                        mainCh.propcache.subchannels = [];
                        cache.channelList.filter(channel => channel.pid == additionalCh).forEach(subCh => {
                            subCh.propcache.teleport_available = teleport_available(mainCh.propcache.channel_name);
                            mainCh.propcache.subchannels.push(subCh);
                        });
                        channels.push(mainCh.propcache);
                    });
                });
                resolve(channels);
            }); 

            var membersPromise = new Promise((resolve, reject) => { 
                let members = [];
                query.serverGroupClientList(row.serverGroupID)
                .then(serverGroupList => {
                    serverGroupList.forEach(member => {
                        var sql = "SELECT * FROM teamspeak_clientDbList WHERE client_database_id = '" + member.cldbid + "'";
                        mysql.query(sql, function (err, result) {
                            if (err) throw err;
                            console.log(result);
                            members.push(result);
                        })
                    });
                })
                .then(() => {
                    console.log(members);
                    resolve(members);
                });
            });
        }

        Promise.all([channelsPromise, membersPromise]).then(function(values) {
            console.log(values);
            returning = {
                'channels' : values[0],
                'members' : values[1],
                'pbot' : row,
            };
            res.send(helper.responseJson(true, returning));
          });

    });
};

};

回答如下:

关于,混合使用回调,promise和async / await非常困难。您最好简化一下。 (否则,您的名字会被以后必须维护此代码的人诅咒。)

当MySQL需要时(无论查询完成还是失败),都会调用第二个mysql.query()方法中的回调。但是您不会在该回调的代码内解决任何承诺或从异步方法返回。因此,您的console.log(result)显示正确的结果,但是您的其他代码无法访问该结果;您的Promise.all会在调用该方法之前解析。

一般来说,这样做是正确的:

                   var sql = 
                      "SELECT * FROM teamspeak_clientDbList WHERE client_database_id = '" + 
                       member.cldbid + "'";
                    mysql.query(sql, function (err, result) {
                        if (err) throw err;
                        console.log(result);
                        members.push(result);
                        resolve (result);    // <<< add this line
                    })

但是在您的情况下,它可能行不通:您的函数query.serverGroupClientList()似乎返回了Promise。您没有向我们展示该功能,因此很难猜测如何将其编织到您的逻辑中。

更多推荐

Array push在promise node.js中不起作用

本文发布于:2024-05-06 21:34:39,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1753858.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:中不   push   Array   promise   js

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!