2016-01-08 3 views
0

Я пытаюсь написать плагин ember-cli-deploy и действительно могу использовать некоторую помощь с обещаниями. В моем index.js для основного плагина, у меня есть следующий код index.js:Обещания в Ember CLI/Ember.js

prepare: function(context) { 
    ... 
    ... 
    var awsDeploymentOptions = {....}; 
    this._awsCodeDeployClient = new CodeDeployClient({awsDeploymentOptions: awsDeploymentOptions}); 

} 
upload: function() { 
    ... 
    ... 
    var uploadPromise = (awsDeploymentOptions.revision.revisionType === 'S3') ? this._awsS3Client.upload(filesToUpload, this.readConfig('s3UploadOptions')) : new Promise().resolve(); 
    return uploadPromise.then(function(result){return this._awsCodeDeployClient.createDeployment(result)}.bind(this)); 
} 

Вышеуказанных работы как предположено и обещание получить решено должным образом.

Если изменить приведенный выше код:

return uploadPromise.then(this._awsCodeDeployClient.createDeployment); 

код не удается. Затем я попытался следующий, который терпит неудачу, а также:

return uploadPromise.then(this._awsCodeDeployClient.createDeployment.bind(this)); 

В обоих вышеуказанных случаях, жалуется на неопределенные переменные/свойства внутри метода createDeployment, который определяется, как показано ниже:

createDeployment: function(s3FileUploadOptions) { 
    return new Promise(function(resolve, reject) { 
     //This is where the problem lies. this is never resolved 
     //to this module's 'this' and I cannot access this.deploymentOptions 
     //Any reference to 'this' variable causes an error 
     var awsDeploymentOptions = this.awsDeploymentOptions; 
     this.codeDeploy.createDeployment(this.awsDeploymentOptions, function(error, data) { 
      if (error) 
       reject(error); // an error occurred 
      else resolve({awsDeploymentId:data.deploymentId}); // successful response. Return deployment Id 
     }.bind(this)); 
    }.bind(this)); 
} 

Что я делаю неправильно в двух сценариях выше?

+0

Не могли бы вы: а) правильно отложить свой код и b) уменьшить его до той части, которая имеет отношение к вашему вопросу? Я почти уверен, что код AWS не имеет никакого значения. – Tomalak

+0

попробуйте это. var that = this; return uploadPromise.then (this._awsCodeDeployClient.createDeployment.bind (это)); – blessenm

ответ

0

Как насчет этого?

return uploadPromise.then(result => this._awsCodeDeployClient.createDeployment(result)); 

Arrow functions сохранить объем от контекста вызова.

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