簡體   English   中英

其他功能完成后如何調用一個功能?

[英]How to call a function after the other function is done?

我的問題是我為我的游戲項目交易網站( 與socket.io!一起使用的網站 )編寫了一個簡單的積壓功能。 當網站加載時,有兩個功能可以獲取用戶和網站的物品清單並將它們列出到兩個框中,但是用戶inv加載速度更快,而有關bot inv加載的信息則稍后出現。 在完成“獲取機器人清單”功能后,我需要執行“獲取用戶清單”功能。 我試圖在它們之間設置一個睡眠功能,但是它僅適用於加載整個功能的主要功能。 換句話說,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())
        })
    })
})

研究諾言。

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

您可能要使用諾言。 首先,用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 });
 })();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM