@@ -274,36 +274,16 @@ class Rule extends EventEmitter {
274
274
// this also covers the 'not' case which should only ever have a single condition
275
275
return evaluateCondition ( conditions [ 0 ] )
276
276
}
277
- let method = Array . prototype . some
278
- if ( operator === 'all' ) {
279
- method = Array . prototype . every
280
- }
281
277
const orderedSets = this . prioritizeConditions ( conditions )
282
- let cursor = Promise . resolve ( )
278
+ let cursor = Promise . resolve ( operator === 'all' )
283
279
// use for() loop over Array.forEach to support IE8 without polyfill
284
280
for ( let i = 0 ; i < orderedSets . length ; i ++ ) {
285
281
const set = orderedSets [ i ]
286
- let stop = false
287
282
cursor = cursor . then ( ( setResult ) => {
288
- // after the first set succeeds, don't fire off the remaining promises
289
- if ( ( operator === 'any' && setResult === true ) || stop ) {
290
- debug (
291
- 'prioritizeAndRun::detected truthy result; skipping remaining conditions'
292
- )
293
- stop = true
294
- return true
295
- }
296
-
297
- // after the first set fails, don't fire off the remaining promises
298
- if ( ( operator === 'all' && setResult === false ) || stop ) {
299
- debug (
300
- 'prioritizeAndRun::detected falsey result; skipping remaining conditions'
301
- )
302
- stop = true
303
- return false
304
- }
305
- // all conditions passed; proceed with running next set in parallel
306
- return evaluateConditions ( set , method )
283
+ // rely on the short-circuiting behavior of || and && to avoid evaluating subsequent conditions
284
+ return operator === 'any'
285
+ ? ( setResult || evaluateConditions ( set , Array . prototype . some ) )
286
+ : ( setResult && evaluateConditions ( set , Array . prototype . every ) )
307
287
} )
308
288
}
309
289
return cursor
0 commit comments