2016-09-27 2 views
1

Я борюсь с передачей контекста «это» из функции прототипа в контроллере для частной функции (ов) в том же контроллере. Консоль браузера выдает сообщение об ошибке «Can not read свойство «callSomeService» неопределенного ». Мой код выглядит следующим образом:Javascript, передавая «это» из прототипа в другую функцию

Может кто-нибудь помочь?

+0

Я не вижу ничего угловатого здесь – Ladmerc

+0

'somePrivateFunction.call (this)' .. Значение этого определяется функцией __how__, а не функцией __where__ ... – Rayon

ответ

0

Чтобы задать контекст, вы можете использовать call или apply.

return somePrivateFunction.call(this).then(...) 

ИЛИ

return somePrivateFunction.apply(this).then(...) 
+0

, которая работает, но я остаюсь с еще один из кода возвращает somePrivateFunction.call (this) .then (...) – Galileo123

+0

, который работает, но у меня остается еще один вопрос: «это» снова теряет свою ссылку в после этого. Какой подход лучше всего подходит для этого? Должен ли я назначить это локальной переменной, такой как «я», и использовать ее? return somePrivateFunction.call (this) .then (...) – Galileo123

+0

Если я правильно понял, вы не можете получить доступ к 'this' внутри' function (resultsFromsomePrivateFunction) ', который вы проходите внутри' then'. Если это так, вы можете создать независимую функцию, а затем передать ее внутри 'then' с помощью bind, что-то вроде:' return somePrivateFunction(). Then (newCreatedThenFunction.bind (this)) 'где функция' newCreatedThenFunction' ' (resultsFromsomePrivateFunction) '. Надеюсь, поможет :) –

0

Вы просто позвонив somePrivateFunction(), для которых this будет либо глобальный объект, или undefined в строгом режиме. Вы либо должны использовать .call или .apply явно установить this значение:

MyController.prototype.somemethod = function(){ 
    return somePrivateFunction.call(this) 
     .then(/* ... */); 
} 

Или передать объект, который вы хотите в качестве аргумента:

MyController.prototype.somemethod = function(){ 
    return somePrivateFunction(this) 
     .then(/* ... */); 
} 

function somePrivateFunction(that){ 
    that.callSomeService() 
    /* ... */ 
} 
0

Ответы, хорошо выглядеть, но вы также должны попробовать установить this к новой переменной. С вами и другими будет легче работать.

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