Home  >  Q&A  >  body text

javascript - 使用async是不是要把await的每一个函数都包装成返回promise对象的?

socketio.listen(socketio_port).on('connection',(client)=>{
    client.on('connect',(obj)=>{
        //do something
    });
    client.on('disconnect',()=>{
       //do something          
    });   
});
Foo();

比如说有这么一个需求,需要控制流程,等到socketio监听端口,并且完成了两个事件绑定之后,再执行Foo();
如果想要只是用async await来控制的话,是不是要把事件绑定包装成返回promise对象的函数,

function listenOnSocket(){
    return new Promise(function (resolve, reject) {
        client.on('connect',(obj)=>{
            //do something
        });
        client.on('disconnect',()=>{
           //do something          
        });   
        resolve();
    });
}

但是对于这个例子,是不是要把每一个事件绑定,都进行封装?因为每一个事件绑定都是异步方法。
刚刚开始学习流程控制这里。。很迷茫。。看到很多promise啊generator啊yield什么的。。头很大。。
有大神通过这个例子来帮助我理解下吗
非常感激

怪我咯怪我咯2630 days ago640

reply all(1)I'll reply

  • 迷茫

    迷茫2017-04-11 09:57:37

    只有执行时间达到一定长度的代码片段才需要异步控制(即包装成返回 Promise 的函数)。.on() 事件绑定都会在毫秒级时间内完成,所以不必单独包装。

    listenOnSocket 这个片段虽然包含了好几个事件绑定,但执行速度可能也快到无需异步控制(你可以简单测试下)。如果要 100% 确保它在 Foo 之前完成,包装成 return Promise 函数也是值得的。包装好后,把 await listenOnSocket() 和 Foo() 依次写进 async 函数体内,或者简单写成 listenOnSocket().then( function(){ Foo(); }) 都可以达到目的。

    reply
    0
  • Cancelreply