异步代码乱序随机丢失变量减速

我一直有这个代码错误,因为 createChannel 部分试图在定义“newChannelRole”之前运行我知道这是由于异步函数的某些性质,但我似乎无法找出确保事情发生的正确方法为了。特别是因为它发生在我的代码的哪些部分似乎是随机的


    async run(msg,args){

        //get our guilds Information

        let guildID = msg.guild.id;

        let locationDataKey = guildID+"_mapData";


        //Our Guild Settings

        let settingMapKey = guildID+"_setting";

        let settings = settingsMap.get(settingMapKey);


        //load up our location Data Array

        let locationDataArray = data.get(locationDataKey);


        //make the new channel

        let formatedNameDashes = args.name.replace(/ /g,"-");

        let formatedNameSpace  = args.name.replace(/-/g," ")


        //make a role for the channel

        let newChannelRole;

        msg.guild.createRole({

            name:formatedNameSpace

        }).then( x => {

            newChannelRole = x;

        });


        //Make the Channel and set the new permissions

        //Everyone has none, NPCs and the unique channel role can see it/type/read history

        msg.guild.createChannel(formatedNameDashes,{

            type:'text',

            permissionOverwrites:[

                {

                    id:msg.guild.defaultRole,

                    deny: ['VIEW_CHANNEL','SEND_MESSAGES','READ_MESSAGE_HISTORY']

                },

                {

                    id:settings.npcRoleID,

                    allow:['VIEW_CHANNEL','SEND_MESSAGES','READ_MESSAGE_HISTORY']

                },

                {

                    id:newChannelRole.id,

                    allow:['VIEW_CHANNEL','SEND_MESSAGES','READ_MESSAGE_HISTORY']


                }

            ]

        }).then( channel => {

            //move it into the category

            let rpCategory = msg.guild.channels.get(settings.rpCategoryID)

            channel.setParent(rpCategory);

            });


            //save the locationDataArray

            data.set(locationDataKey,locationDataKey);     

        });   

    }


守着一只汪
浏览 161回答 3
3回答

LEATH

问题是您调用后的代码then不会等待then连接到的承诺解决。为了让等待,你必须把它所有在该then处理后newChannelRole = x;线。但是由于您使用的是async函数,所以不要使用.then,使用await. 见***评论:async run(msg,args){    //get our guilds Information    let guildID = msg.guild.id;    let locationDataKey = guildID+"_mapData";    //Our Guild Settings    let settingMapKey = guildID+"_setting";    let settings = settingsMap.get(settingMapKey);    //load up our location Data Array    let locationDataArray = data.get(locationDataKey);    //make the new channel    let formatedNameDashes = args.name.replace(/ /g,"-");    let formatedNameSpace  = args.name.replace(/-/g," ")    //make a role for the channel    let newChannelRole = await msg.guild.createRole({                        // ***        name:formatedNameSpace    });    //Make the Channel and set the new permissions    //Everyone has none, NPCs and the unique channel role can see it/type/read history    const channel = await msg.guild.createChannel(formatedNameDashes,{       // ***        type:'text',        permissionOverwrites:[            {                id:msg.guild.defaultRole,                deny: ['VIEW_CHANNEL','SEND_MESSAGES','READ_MESSAGE_HISTORY']            },            {                id:settings.npcRoleID,                allow:['VIEW_CHANNEL','SEND_MESSAGES','READ_MESSAGE_HISTORY']            },            {                id:newChannelRole.id,                allow:['VIEW_CHANNEL','SEND_MESSAGES','READ_MESSAGE_HISTORY']            }        ]    });    //move it into the category    let rpCategory = msg.guild.channels.get(settings.rpCategoryID)    channel.setParent(rpCategory);    //push the information into the locationDataArray    mapDataArray.push({        name:formatedNameSpace,        channelName:channel.name,        connections:[],        channelID:channel.id    });    //save the locationDataArray    data.set(locationDataKey,locationDataKey);     }请注意,任何调用都run需要处理run返回承诺的事实(因为所有 async函数都返回承诺)。特别重要的是,无论调用它处理承诺拒绝(或将承诺传递给将)。

SMILET

改变这一点:msg.guild.createRole({        name:formatedNameSpace    }).then( x => {        newChannelRole = x;    });对此:newChannelRole = await msg.guild.createRole({        name:formatedNameSpace    })

慕的地10843

使用异步函数时,请尝试使用 await 实现function sleep(ms) {                                                            return new Promise(resolve => setTimeout(resolve, ms));                  }function SecondCall(){console.log('I got called in order');}function resolveAfter2Seconds() {  return new Promise(resolve => {    setTimeout(() => {      resolve('resolved');    }, 2000);  });}async function asyncCall() {  console.log('calling');  var result = await resolveAfter2Seconds();   console.log(result);   await sleep(1000); SecondCall();  // expected output: 'resolved'}asyncCall();
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript