Я пытаюсь написать плагин 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));
}
Что я делаю неправильно в двух сценариях выше?
Не могли бы вы: а) правильно отложить свой код и b) уменьшить его до той части, которая имеет отношение к вашему вопросу? Я почти уверен, что код AWS не имеет никакого значения. – Tomalak
попробуйте это. var that = this; return uploadPromise.then (this._awsCodeDeployClient.createDeployment.bind (это)); – blessenm