对于async的错误理解

来源:互联网 发布:jquery点击事件源码 编辑:程序博客网 时间:2024/05/17 04:52

/** * Created by qiucheng on 15/8/27. */var async = require("async");var arr = [1, 2, 3];var transformed = arr.map(function (ele) {    return ele * 3;});console.log(transformed);async.map(arr, function (val, callback) {        setTimeout(function () {            console.log(val);            callback(null, val * 2);        }, 10);    },    function (err, results) {        if (err) {            console.log(err);        }        console.log(results);    });console.log("end");


上面这段代码中,map和async.map的区别在于,async版本的第二个参数的函数内可以调用异步方法,然后通过callback的方式表示返回值。

也就是说如果第二个参数的函数里没有异步方法的话,map和async版本是一样的。


async.map(arr, function (val, callback) {//该版本和不适用async.map一致        console.log(val);        callback(null, val * 2);    },    function (err, results) {        if (err) {            console.log(err);        }        console.log(results);    });

并且,如果说在某些情况下的确不需要使用异步操作时,也不能在第二个函数中直接调用callback函数,不然可能会引起stack overflow,如下图所示:

async.eachSeries(hugeArray, function iterator(itemcallback) {
  if (inCache(item)) {
    callback(null, cache[item]); // if many items are cached, you'll overflow 
  } else {
    doSomeIO(item, callback);
  }
}, function done() {
  //... 
});


正确做法应该是;

async.eachSeries(hugeArray, function iterator(itemcallback) {
  if (inCache(item)) {
    async.setImmediate(function () { //让他进入下一次运行队列
      callback(null, cache[item]);
    });
  } else {
    doSomeIO(item, callback);
  //... 

0 0
原创粉丝点击