0

私は 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 つのシナリオで何が間違っていますか?

4

1 に答える 1