如何在完成其他功能后调用函数?

时间:2018-04-12 13:43:49

标签: javascript html socket.io

我的问题是我为我的游戏物品交易网站编码了一个简单的积压功能(使用socket.io的网站!)。当网站加载时,两个函数获取带有项目的用户和站点库存并将它们列在两个框中,但是用户inv加载速度更快,并且随着bot inv的加载,稍后会出现有关积压的信息。完成“get bot inventory”功能后,我需要执行“获取用户库存”功能。我试图在它们之间设置一个sleep函数,但它只适用于加载整个函数的main函数。换句话说,当在两个函数之间设置时,sleep(2000)延迟加载两个库存。 抱歉我的英语不好:-D

Aaand有我的代码(我只留下重要部分):

io.on('connection', (socket) => {
    var userObject = false
    if (
        typeof socket.handshake.session.passport !== 'undefined' &&
        typeof socket.handshake.session.passport.user !== 'undefined' &&
        typeof socket.handshake.session.passport.user.id !== 'undefined'
    ) {
        userObject = socket.handshake.session.passport.user
    }

    socket.emit('site', config.site)
    socket.emit('user', userObject)

    socket.on('get bot inv', (id) => {
        Trade.getInventory(config.bots[id].steamID64, config.appID, config.contextID, (err, data) => {
            socket.emit('bot inv', { error: err, items: data })
        })
    })
   socket.on('get user inv', (steamID64) => {
        Trade.getInventory(steamID64, config.appID, config.contextID, (err, data) => {
            socket.emit('user inv', { error: err, items: data })
        })
    })
    socket.on('get bots inv', () => {
        const params = []
        Object.keys(config.bots).forEach((index) => {
            const bot = config.bots[index]
            params.push({
                id: index,
                steamID64: bot.steamID64,
                appID: config.appID,
                contextID: config.contextID,
            })
        })

        Trade.getInventories(params, (data) => {
            socket.emit('bots inv', data)
            socket.emit('bots floats', Trade.getFloatValues())
        })
    })
})

2 个答案:

答案 0 :(得分:4)

了解承诺。

var promise1 = new Promsie((resolve, reject) => {
  socket.on('get bot inv', (id) => {
        Trade.getInventory(config.bots[id].steamID64, config.appID, config.contextID, (err, data) => {
            socket.emit('bot inv', { error: err, items: data })
            resolve();
        })
    })
})

var promise2 = new Promsie((resolve, reject) => {
 socket.on('get user inv', (steamID64) => {
        Trade.getInventory(steamID64, config.appID, config.contextID, (err, data) => {
            socket.emit('user inv', { error: err, items: data })
            resolve();
        })
    })
})

如果你想等到一个完成

promise1.then(() => {return promise2});

如果您想要执行N个事务并等待所有事情,请使用以下

Promise.all([promise1, promise2]).then(() => {execute something else});

有关进一步的文件:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/all

答案 1 :(得分:0)

您可能想要使用promises。首先,使用promise:

封装套接字侦听器和API调用
  const getUserId = new Promise(res => socket.on('get bot inv', res));
 const getBotId = new Promise(res => socket.on('get bot inv', res));

  function getInventory(id) {
    return new Promise((res, rej) => {
      Trade.getInventory(id, config.appID, config.contextID, (err, data) => {
        if(err) rej(err) else res(data);
    });
  }

然后很容易将承诺链接起来:

 (async function() {
   const userID = await getUserId;
   const data = await getInventory(userID);
   socket.emit({ data });

   const botID = await getBotId;
   const botData = await getInventory(config.bots[botID].steamID64);
   socket.emit({ botData });
 })();