如何在满足条件时中断async.js map的迭代器循环

时间:2017-01-19 10:01:32

标签: javascript node.js async.js

此处date是一个数组。当if条件满足时,它必须从迭代器中break。但由于迭代器,它继续循环。它再次执行if条件并抛出错误“无法在发送后设置标头”。一旦执行if条件,我就必须打破迭代器。

validatemultiday: function(req, callback) {
  async.map(edate, function iterator(date, mapCb) {
    var rangedate = moment(date).format("YYYY-MM-DD");
    if (rangedate == studentfromdate || rangedate == studenttodate) {
      sails.log.info("does1");
      callback(null, 1);
    } else {
      sails.log.info("do2");
      mapCb(null, 2);
    }
  }, callback);
}

4 个答案:

答案 0 :(得分:1)

如果执行if-condition,则仅返回false。它正在发挥作用。

validatemultiday: function(req,callback){
                            var range = true;
                            async.map(edate, function iterator (date, mapCb){
                            var rangedate = moment(date).format("YYYY-MM-DD");
                            if(rangedate==studentfromdate||rangedate==studenttodate){
                                sails.log.info("does2");
                                range=false;
                                mapCb(null,range);
                            }
                            else{
                                sails.log.info("did2");
                                if(range==false){
                                    mapCb(null,range);
                                }
                                else{
                                    range=true;
                                    sails.log.info('2:'+range);
                                    mapCb(null,range);
                                }
                            }
                            });
                            setTimeout(function(){
                            callback(null,range);
                            },100);
                            }

答案 1 :(得分:0)

致电callback()或使用break声明。

答案 2 :(得分:0)

如果希望循环停止,请尝试break;return;

答案 3 :(得分:0)

_.someasync.some在这里很有用。

如果您想对edate中的每个日期执行一些异步操作,请使用此选项

validatemultiday: function(req, callback) {
    async.some(edate, function iterator(date, someCb) {
        var rangedate = moment(date).format('YYYY-MM-DD');
        var isOnRange = (rangedate == studentfromdate || rangedate == studenttodate);
        // sample async operation: fs.exists
        return fs.exist(rangedate, someCb);
    }, function(result) {
        sails.log.info('validatemultiday', 'result', result);
        return callback(null, result ? 1 : 2);
    });
}

如果只有同步检查edate中的每个日期

,请使用此选项
validatemultiday: function(req, callback) {
    var result = _.some(edate, function(date) {
        var rangedate = moment(date).format('YYYY-MM-DD');
        var isOnRange = (rangedate == studentfromdate || rangedate == studenttodate);
        return isOnRange;
    });

    return callback(null, result ? 1 : 2);
    // Zalgo alert: Ideally below return statement should be used in place of above one because above code is synchronous to contain Zalgo.
    // return async.nextTick(function() {
    //     return callback(null, result ? 1 : 2);
    // });
}

Zalgo:如果你刚开始使用异步编程,请跳过Zalgo的东西。