2016-09-22 2 views
0

По какой-то причине метод getTwo() внутри PollClass не вернет 2, но undefined. Если я поставлю оператор return за пределами цикла .forEach(), значение возвращается.Методы класса ES6, не возвращающие ничего внутри петли forEach

class Poll { 
    constructor(name) { 
    this.name = name; 
    this.nums = [1, 2, 3]; 
    } 

    getTwo() { 
    this.nums.forEach(num => { 
     if (num === 2) return num; 
    }) 
    } 
} 

const newPoll = new Poll('random name'); 
console.log(newPoll.getTwo()); // returns undefined, not 2 

Это проблема с закрытием, ES 6 или целая другая проблема?

+0

Пока не ясно, что вы хотите, чтобы вернуться, если 'this.nums' не имеет 2, или если он имеет больше, чем один. В любом случае вам лучше использовать '.some' вместо' forEach'. – raina77ow

+0

'forEach' ничего не вернет. Это не 'for' loop – Redu

+0

*« Это проблема с закрытием, ES 6 или целая другая проблема? »* Ничего. Внутренние функции не могут заставить внешнюю функцию возвращать что-то. –

ответ

7

Функция стрелки по-прежнему является функцией, и вы возвращаетесь только из функции обратного вызова forEach, а не из getTwo, вам также нужно вернуться из функции getTwo.

Это не совсем понятно, почему вы должны использовать цикл, чтобы проверить что-то в этом пути, но концепция будет что-то вроде

getTwo() { 
    var n = 0; 
    this.nums.forEach(num => { 
     if (num === 2) n = num; 
    }) 
    return n; // returns something from getTwo() 
    } 
+2

Хотя это будет работать, оно все еще субоптимально, так как оно будет продолжать цикл даже после обнаружения «2». В зависимости от того, что OP хочет, чтобы поведение было, либо традиционный цикл 'for', либо' find' будут лучшими параметрами. –

+2

@JustinNiessner - конечно, 'Array.some',' Array.find', 'Array.indexOf' и множество других методов массива могут быть полезны здесь, но неясно, чего хочет OP, например' Array. some' вернет логическое значение. – adeneo

+0

'return this.nums.indexOf (2)! == -1' был бы самым легким, хотя, если он просто должен проверить, существует ли это число в массиве. – adeneo

4

Как adeneo упоминалось, вы должны вернуться из getTwo функции к достичь того, чего вы хотите. Возвращаясь из обратного вызова, переданного в forEach, независимо от его функции стрелки или нет, не возвращается с forEach.

В качестве альтернативы forEach, вы можете использовать find, которые вы можете написать меньше кода и вернуться непосредственно:

getTwo() { 
    return this.nums.find(num => num === 2); 
} 
+0

Я не знал о методе поиска, и этот код избавляет меня от многих головных болей, пытаясь пошатнуть значение индекса, поэтому я ценю вашу помощь! – Rich

+0

Рад помочь помощнику – nem035

Смежные вопросы