如何在满足条件时跳出 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 内容。
这里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 内容。