2016-02-25 2 views
3

В браузере я пытаюсь использовать ES6-обещание и ES6-выборку с действиями Reflux.js, но у меня возникли проблемы с привязкой контекста «this» в рамках анонимной функции стрелок. Что я делаю не так?Es6 Fetch/Promise Context

* Update * Я использую Reflux.js ListenAndPromise, я, вероятно, следовало бы добавить это в моем Orignal вопрос

* Обновление *

Got контекст работает, когда я удалить внешняя стрелка функция Это работает:

CrewActions.fetchCrew.listenAndPromise(function() { 
 
    fetch('crew.json') 
 
    .then(function() { 
 
    console.log(this); // This is bound as expected 
 
    }.bind(this)) 
 
});

Но это не работает

CrewActions.fetchCrew.listenAndPromise(function() { 
 
    fetch('crew.json') 
 
    .then(() => { 
 
    console.log(this); // undefined 
 
    }) 
 
});

Так что я думаю, я ошибаюсь о том, как стрелка функции работают? Я думал, что они связаны этим контекстом?

Ни один из приведенных ниже примеров не работает.

Пример.

CrewActions.fetchCrew.listenAndPromise(() => { 
 

 
    console.log(this) 
 
    // functor() { 
 
    // var triggerType = functor.sync ? "trigger" : "triggerAsync"; 
 
    // return functor[triggerType].apply(functor, arguments); 
 
    // } 
 

 
    fetch('crew.json') 
 
    .then(_.bind(() => { 
 
     console.log(this) // undefined 
 
    }, this)) 
 

 

 
    fetch('crew.json') 
 
    .then(() => console.log(this)); // undefined 
 

 
    fetch('crew.json') 
 
    .then(function() { 
 
     console.log(this) // undefined 
 
    }); 
 

 

 
    fetch('crew.json') 
 
    .then(function() { 
 
     console.log(this) // undefined 
 
    }.bind(this)); 
 
});

+2

В первом случае вы не можете привязывать функции стрелок. В остальном, что такое «это» определяется как в первую очередь? Последний пример должен работать, попробуйте . Then (function() {console.log (this)}. Bind ({jellybeans: true})), и он должен регистрировать объект jellybeans. – Dtipson

+1

узел или браузер? пожалуйста, предоставьте [mcve] –

+2

эти вызовы, сделанные в глобальном контексте или внутри экземпляра объекта? – Icepickle

ответ

1

При попытке упрощенной версии функции версии Стрелы, что:

function listenAndPromise() { 
console.log('outer fn',this); 
    return fetch('crew.json') 
    .then(() => { 
    console.log('arrowfn',this); // undefined 
    }) 
} 
listenAndPromise.bind({test:4})(); 

Он регистрирует, внешний Fn Object {теста: 4}, то arrowfn Object {тест : 4}

Это то, чего я ожидал бы. Внешней функции задан этот контекст, и функция стрелки не добавляет новый «этот» контекст/значение. Ваши результаты могут иметь больше общего с вашей средой (или то, что CrewActions.fetchCrew.listenAndPromise привязывает «это» к), чем внутренние функции.