私は ember-cli-deploy プラグインを作成しようとしていますが、promise の助けを借りることができます。メイン プラグインの index.js には、次のコード index.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));
}
上記の 2 つのシナリオで何が間違っていますか?