如何在满足条件时跳出 async.js 地图的迭代器循环

How to break out of async.js map's iterator loop when a condition is met

这里date是一个数组。当 if 条件满足时,它必须 break 退出迭代器。但是由于迭代器,它继续循环。它再次执行 if 条件并抛出错误 "can't set header after they are sent"。一旦执行 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);
}

调用callback()或使用break语句。

当您希望循环停止时尝试 break;return;

它 returns 只有在执行 if-condition 时才为假。正在运行。

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);
                            }

_.some or async.some 在这里会有用。

如果您想对 edate

中的每个日期执行一些 async 操作,请使用此选项
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);
    });
}

如果只有 sync 检查 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 内容。