异步编程的优势和难点

Posted 染简夕

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了异步编程的优势和难点相关的知识,希望对你有一定的参考价值。

 

传统解决方式:

  • 多线程: 多线程上下文切换问题,锁问题,同步问题
  • c/c++手动完成:门槛较高

node基于事件的非阻塞编程

优势:

  • 非阻塞I/O可以使CPU与I/O并不依赖,可以更大程度的利用资源

  • 对于网络应用,并行带来的优势更大,利于分布式和云的应用

  • 由于调用了c/c++的扩展模块,node的性能较高

难点:

  1. 异常处理

    1. 不能使用try/catch/final对异步编程进行异常处理,因为发生异常的代码不一定在本次事件循环中执行,所以有可能捕捉不到

       解决方法:给callback第一个参数传递是否报错,未报错则返回null报错则返回error对象。

       原则:在编写自定义异步方法时,必须执行调用者传入的参数,必须正确返回参数callback(null, results)

    2. 对用户调用的回调函数进行try/catch

      try {
        	req.body = JSON.parse(buf, options.reviver);
        	callback();
      } catch (err){
       	err.body = buf;
        	err.status = 400;
      	callback(err);		
      }

      这样就会导致callback中出错也会被catch到,导致调用两次callback

      解决方法:

      try {
        	req.body = JSON.parse(buf, options.reviver);
      } catch (err){
       	err.body = buf;
        	err.status = 400;
      	callback(err);		
      }  	
      callback();
  2. 阻塞代码:不要用while来阻塞,用setTimeout

  3. 多线程:用child_process

  4. 回调过多 解决方案异步编程的优势和难点-多异步之间的协作方案

 

以上是关于异步编程的优势和难点的主要内容,如果未能解决你的问题,请参考以下文章

python异步(Async)编程

JavaScript学习--Item27 异步编程异常解决方案

javascript中异步操作的异常怎么处理

异步编程之 EventLoop

异步编程之 EventLoop

4.2 前端开发日报——JS异步编程之Promise详解和使用总结