0

Есть несколько сообщений по этой теме, но не удалось найти тот, который объясняет концепцию контекста в Promises. Начнем с некоторого кода (это взято из модуля ember.js и упрощен, но может быть любой JS код, который поддерживает обещания):Правильный способ обработки контекста в Promise

module.exports = CoreObject.extend({ 

init: function(pluginOptions, parentObject) { 
//These are the properties that I want to access in methods below. 
this.parentObject = parentObject; 
this.propertyA = pluginOptions.propertyA; 
this.propertyB = pluginOptions.propertyB; 

}, 

startProcessing: function(whatToProcess) { 
/* The following line does not work which is okay 
     return this.prepareForProcessing(whatToProcess).then(process).then(postProcess(processedData, this); */ 

//This line does work, but parameters to then don't work. The result of prepareForProcessing is not passed to process and so on. 
     return this.prepareForProcessing(whatToProcess).then(this.process).then(this.postProcess); 

}, 

prepareForProcessing: function(whatToProcess) { 
//this does not work as 'this' is set to a different context 
//What does 'this' refer to here? 
//How do I access propertyA, propertyB defined at the beginning of this object? 
    if(this.propertyA) { 
    .... 
} 
process: function(preparedData) { 
    //this does not work either 
    if(this.propertyB) { 
    ..... 
    } 
} 
postProces: function(processedData, options) { 
//This should work for obvious reasons but is the best way? 
if(options.propertyA) { 
    ...... 
} 

} 

} 
}) 

Теперь мои вопросы заключаются в следующем:

  1. Обратитесь к комментариям внутри функции prepareForProcessing выше. Что означает «эта» переменная в методе, когда вызывается из «затем» метода обещания? Если я сброшу «этот» объект, кажется, что он относится к некоторому глобальному объекту clob, но не к этому модулю.
  2. Как получить/получить доступ к вышеуказанным свойствам метода? Один из очевидных способов - передать опцию в качестве аргументов, но не уверен, что это правильный путь. Если вы посмотрите на код here (строка номер 34), параметры передаются для каждого вызова «then». Но разве это не противоречит принципам ООП с переменными уровня класса/экземпляра, которые можно использовать повторно? Я относительно новичок в JS и не понимаю модель на основе Object, полностью, поэтому, пожалуйста, простите меня, если это звучит как глупый вопрос.

Буду признателен за любую помощь & руководство. Огромное спасибо.

+0

Я не понимаю, почему 'this' не будет то, что вы ожидаете в' prepareProcessing', как вы только когда-либо назвать его через 'this':' это .prepareForProcessing (...) '. –

ответ

0

Вы должны использовать Function.prototype.bind:

this.prepareForProcessing(whatToProcess).then(this.process.bind(this)).then(this.postProcess.bind(this)); 
Смежные вопросы