2017-01-04 13 views
0

Вот упрощенная версия кода:Вложенные функции стрелка получает глобальную область видимости

class Service { 
    static _runRequest = (request, success, failure) => { 
     request.then(
      (response) => { 
       if (ResponseHelper.wasSuccessful(response)) { 
        success(response); 
       } 
       else if (ResponseHelper.wasUnauthorized(response)) { 
        SessionHelper.refreshCurrentSession().then(
         (refreshResponse) => { 
          if (refreshResponse === true) { 
           this._runRequest(request, success, failure); 
          } 
         } 
        ); 
       } 
      } 
     ); 
    } 
} 

Вопрос заключается в том, что при вызове _runRequest снова, если сеанс был обновлен успешно, this указывает на глобальную область видимости.

Любые идеи, почему и как это исправить? Не должно this оставаться таким же независимо от того, сколько вложенных функций есть?

+1

Просьба представить рабочий фрагмент кода, который демонстрирует проблему. – trincot

+3

Если вы хотите, чтобы он указывал на 'Сервис', то не используйте стрелку как' _runRequest', используйте обычную функцию. – loganfsmyth

+0

@loganfsmyth yup, который решил это! вау, да, как говорится, функция стрелки не является серебряной пулей. Пожалуйста, создайте правильный ответ, чтобы я мог его принять. – dccarmo

ответ

0

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

Вместо определения статического метода с синтаксисом стрелки, используйте более установленный, укороченную функцию обозначение:

static _runRequest(request, success, failure) { // ...etc 

Это заставит this ссылаться на объект «класса».

Ниже для сравнения двух способов определения статического метода, с упрощенным кодом (без вложенности, никаких обещаний) с помощью Бабеля:

class Service1 { 
 
    static _runRequest = (i) => { 
 
     if (i == 0) { 
 
      console.log('zero'); 
 
      return; 
 
     } 
 
     if (this && '_runRequest' in this) { 
 
      return this._runRequest(0); // recurse 
 
     } 
 
     console.log('this is ' + this); 
 
    } 
 
} 
 

 
Service1._runRequest(1); 
 

 
class Service2 { 
 
    static _runRequest(i) { 
 
     if (i == 0) { 
 
      console.log('zero'); 
 
      return; 
 
     } 
 
     if (this && '_runRequest' in this) { 
 
      return this._runRequest(0); // recurse 
 
     } 
 
     console.log('this is ' + this); 
 
    } 
 
} 
 

 
Service2._runRequest(1);

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