您不知道JS:异步与性能-合作并发吗?

时间:2019-10-30 11:38:04

标签: javascript ajax asynchronous

凯尔(Kyle)示例是关于通过异步事件对数据(如此之大)进行分块,并使事件在事件循环队列中交织,那部分我无法获得:

书中的示例

var res = [];
// `response(..)` receives array of results from the Ajax call
function response(data) {

   var chunk = data.splice( 0, 1000 );

   res = res.concat(

    chunk.map( function(val){
      return val * 2;
    } )
  );

  if (data.length > 0) {

    setTimeout( function(){
        response( data );
    }, 0 );
  }
}
// ajax(..) is some arbitrary Ajax function given by a library
ajax( "http://some.url.1", response );
ajax( "http://some.url.2", response );

我无法理解这一部分,我不能接受这样可以使代码性能更好,不会导致两个数组中的数据交错,或者我只是不了解事件循环的工作原理?

1 个答案:

答案 0 :(得分:3)

看来您是正确的,因为多个ajax调用可能会导致数据排序错误(您非常聪明地注意到+1),并且发布的代码可以得到:

  1. ajax通话1开始
  2. ajax通话1完成
  3. 追加呼叫1中的前1000个元素
  4. ajax通话2开始
  5. 追加通话1中的后1000个元素
  6. ajax通话2完成
  7. 追加呼叫2中的前1000个元素
  8. 追加通话1中的后1000个元素

关于问题的性能方面,请记住“性能”不仅仅是一回事。如果按性能来表示“此代码块运行需要多长时间”,那么分块将导致性能下降。但这是前端。 “性能”实际上与用户体验有关,您的Javascript代码在主线程上运行。如果您进行10秒钟的操作,则您的UI会在10秒钟内无响应。如果对它进行分块,那么即使页面需要花费更长的时间,用户仍可以在页面运行时与它进行交互。