如何在web中实现类似异步IO


实现对话式的web应用程序。我想实现的逻辑需要多次对话完成。就像填一个登录表单,每次只填一项,提交一次。大概的形式如下:

--- 第一次请求和响应 ---

(客户端)-->   “我要登录” 

                    “请输入用户名”  <--(服务器端)         

--- 第二次请求和响应 ---

(客户端)-->   “myname”

                     “请输入密码”  <--(服务器端)

--- 第三次请求和响应 ---

(客户端)-->   “password”

                      “登录成功”  <--(服务器端)

一次完整的业务是有多次连续的请求完成的,可以理解成三个请求是一个事务。当然用session记录每一次提交的,来操作也是可以的。但我看了一些关于异步IO的文章,是不是可以实现异步方式,第一次请求的时候启动一个handle,等待以后几次请求,凑齐用户名和密码在返回登录结果。

def process_request(request):
    request_handle(request)
def request_handle(request):
    wait_for_next_request(request):

浏览sf时发现一个关于微信的问题,和我问的一样: http://weixin.segmentfault.com/q/1010...
二楼说实现一个状态机,我可以将每一次的请求都存到数据库中,这和我想的“存到session”中是一个道理。

关于1楼的回答,因为这个应用是微信公众平台的后台部分,所以前端不是一个简单的浏览器,所以没法“使用cookie”或者“在客户端保存几步的信息一并提交”。

另外怎么联系@SegmentFault 的人,我想把这个问题转到“微信子站”去

web 微信 异步io

ljksnb 11 years, 8 months ago

你问题中的示例情景,建议以:前端与用户交互问答,保存用户回答数据,到最后一步一次性提交的方式来实现。

如果在每次问答都需提交验证一次数据的场景中,我们就得知道:web client 与 server 的交互是无状态的,因此,服务端对客户端的身份识别,必然需要一个凭证,来做为双方数据交互的基础。这个凭证可以使用 cookie 来保存,让真正的数据保存在服务端。

你也可以这么做,把数据保存在JS对象中,到最后一步来验证

//状态对象
  var obj = {
    a1: false,
    a2: false,
    a3: false
  }

  //绑定用户输入完成事件,提交数据
  $.ajax({
    url: "http://ooxx.cn/a1",
    success:function(a1){
      obj.a1 = a1
    }
  });

  $.ajax({
    url: "http://ooxx.cn/a2",
    success:function(a2){
      obj.a2 = a2
    }
  });

  $.ajax({
    url: "http://ooxx.cn/a2",
    success:function(a3){
      obj.a2 = a3;

      //验证有效性
      if(obj.a1 && obj.a2 &&obj.a3){
        console.log('ok');
      }
    }
梦魇Tsuki answered 11 years, 8 months ago

Your Answer