为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

守着一只汪 2022-01-07 16:06:11
我一直有这个代码错误,因为 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);             });       }
查看完整描述

3 回答

?
LEATH

TA贡献1936条经验 获得超7个赞

问题是您调用后的代码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函数都返回承诺)。特别重要的是,无论调用它处理承诺拒绝(或将承诺传递给将)。


查看完整回答
反对 回复 2022-01-07
?
SMILET

TA贡献1796条经验 获得超4个赞

改变这一点:


msg.guild.createRole({

        name:formatedNameSpace

    }).then( x => {

        newChannelRole = x;

    });

对此:


newChannelRole = await msg.guild.createRole({

        name:formatedNameSpace

    })


查看完整回答
反对 回复 2022-01-07
?
慕的地10843

TA贡献1785条经验 获得超8个赞

使用异步函数时,请尝试使用 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();


查看完整回答
反对 回复 2022-01-07
  • 3 回答
  • 0 关注
  • 160 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号