我正在使用meteor.js和MongoDB构建一个应用程序,我有一个关于cursor.forEach()的问题。
我想在每次forEach迭代的开始检查一些条件,然后跳过元素,如果我不需要对它进行操作,这样我可以节省一些时间。
这是我的代码:
// Fetch all objects in SomeElements collection
var elementsCollection = SomeElements.find();
elementsCollection.forEach(function(element){
if (element.shouldBeProcessed == false){
// Here I would like to continue to the next element if this one
// doesn't have to be processed
}else{
// This part should be avoided if not neccessary
doSomeLengthyOperation();
}
});
我知道我可以使用cursor.find().fetch()将光标转向数组,然后使用常规for循环迭代元素,并正常使用continue和break,但我感兴趣的是,如果在forEach()中使用类似的东西。
如果你在使用经典的for循环,不想使用continue,你可以在里面使用self- execute函数,并使用return来模仿continue行为:
for (let i = 0; i < 10; i++) {
(() => {
if (i > 5) return;
console.log("no.", i)
})();
}
console.log("exited for loop")
输出:
[LOG]: "no.", 0
[LOG]: "no.", 1
[LOG]: "no.", 2
[LOG]: "no.", 3
[LOG]: "no.", 4
[LOG]: "no.", 5
[LOG]: "exited for loop"
下面是一个用for of和continue代替forEach的解决方案:
let elementsCollection = SomeElements.find();
for (let el of elementsCollection) {
// continue will exit out of the current
// iteration and continue on to the next
if (!el.shouldBeProcessed){
continue;
}
doSomeLengthyOperation();
});
如果你需要在循环中使用在forEach中不起作用的异步函数,这可能会更有用一些。例如:
(async fuction(){
for (let el of elementsCollection) {
if (!el.shouldBeProcessed){
continue;
}
let res;
try {
res = await doSomeLengthyAsyncOperation();
} catch (err) {
return Promise.reject(err)
}
});
})()
如果你在使用经典的for循环,不想使用continue,你可以在里面使用self- execute函数,并使用return来模仿continue行为:
for (let i = 0; i < 10; i++) {
(() => {
if (i > 5) return;
console.log("no.", i)
})();
}
console.log("exited for loop")
输出:
[LOG]: "no.", 0
[LOG]: "no.", 1
[LOG]: "no.", 2
[LOG]: "no.", 3
[LOG]: "no.", 4
[LOG]: "no.", 5
[LOG]: "exited for loop"