[造轮子] 所以为啥后端不能向前端请求数据?

2016-12-13 14:18:10 +08:00
 bramblex

造轮子初衷

前端向后端请求数据从上古时期就不是什么新鲜事,后端向前端推送数据自从有了 socket.io 这种神器以后也没什么大不了的了,那为啥后端为什么不可以向前端那用个类似 Ajax 的东西请求数据?于是我就造了这么个东西 IORequest https://github.com/bramblex/io-request ,不仅能用 socket.io 像 Ajax 一样从前端向后端发送请求,同时也可以从后端向前端发送请求。

简单例子

假设我们现在要做一个简单 web 版本的猜拳对战游戏,服务器端的游戏逻辑只需要这样写

class Game {

  constructor (left, right) {
    co(function *() {
      const home_id = next_home_id++
      left.emit(`msg`, `游戏开始,游戏房间号[${home_id}],等待你出拳`)
      right.emit(`msg`, `游戏开始,游戏房间号[${home_id}],等待你出拳`)
      
      // 这里就是向前端请求 choice 方法,并且等待前端的返回
      const [l, r] = yield [
        left.ioRequest({method: 'choice'}),
        right.ioRequest({method: 'choice'})
      ]

      // 后端接受到前端的返回后继续游戏的进程
      const _choices = [null, '布', '剪刀', '石头']
      left.emit('msg', `你出的是[${_choices[l]}], 对方出的是[${_choices[r]}]`)
      right.emit('msg', `你出的是[${_choices[r]}], 对方出的是[${_choices[l]}]`)

      // 比较并且得出结果
      if (Game.compare(l, r)) {
        left.emit('msg', '你赢了')
        right.emit('msg', '你输了')
      } else {
        right.emit('msg', '你赢了')
        left.emit('msg', '你输了')
      }
		
      // 游戏结束,关闭链接
      right.disconnect()
      left.disconnect()

    })
  }
}

而前端逻辑更简单了

  // 前端在这里只需要处理后端发送的 choice 请求,并且处理完后通过 response 返回请求的数据
  ioReqClient.handle('choice', ({response}) => {
    const choices = document.getElementById('choices')
    choices.style.display = 'block'

    const shi = document.getElementById('shi')
    const jian = document.getElementById('jian')
    const bu = document.getElementById('bu')

    // 当按钮被点击的时候
    shi.onclick = () => {
      response(3) // 在这里给后端返回
      choices.style.display = 'none'
      msgLog('我出的是[石头]')
    }
    
    // 同上
    jian.onclick = () => {
      response(2)
      choices.style.display = 'none'
      msgLog('我出的是[剪刀]')
    }
    
    // 同上
    bu.onclick = () => {
      response(1)
      choices.style.display = 'none'
      msgLog('我出的是[布]')
    }
  })

完整例子

这里是上面那个例子的完整实现。 https://github.com/bramblex/io-request/tree/master/example

3009 次点击
所在节点    JavaScript
3 条回复
afpro
2016-12-13 19:40:11 +08:00
你想要的是 Wt
aristotle9
2016-12-13 23:29:42 +08:00
Reverse Ajax, Part 1: Introduction to Comet
http://www.ibm.com/developerworks/library/wa-reverseajax1/
latelx
2016-12-15 02:38:34 +08:00
思路不错

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/327313

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX