Как не потерять «этот» контекст в приложении JavaScript?

Вот пример моего кода:

function QueueService() {
    var key = Config.get("AWS.accessKeyID");
    var secret = Config.get("AWS.secretKey");
    var credentials = new AWS.Credentials(key, secret, sessionToken = null);

    this._sqs = new Promise.promisifyAll(new AWS.SQS({apiVersion: '2012-11-05', region: "us-west-2", endpoint: "sqs.us-west-2.amazonaws.com", credentials: credentials}));
}

QueueService.prototype.FillBirdQueue = function(birds) {
    var self = this;

    birds.forEach(function(bird_batch) {
        var params = {
            Entries: bird_batch,
            QueueUrl: Config.get("AWS-Queue.Birds")
        };

        return self._sqs.sendMessageBatchAsync(params);
    });
};

Если я опускаю var self = this; и вызываю return this._sqs.sendMessageBatchAsync(params);, я получаю сообщение об ошибке, потому что _.sqs не определено. Похоже, что this изменился, и единственный способ обойти это — сохранить его для последующего использования с помощью var self = this;.

Я чувствую, что есть лучший способ сделать это, но я не совсем уверен, как использовать имеющиеся в моем распоряжении инструменты. В настоящее время я использую Bluebird и Lodash, оба из которых поддерживают привязку. В прошлом я прошел this, выполнив в Bluebird следующее:

somethingAsync().bind(this).then(function(result){});

Я не смог использовать этот шаблон, потому что сначала я ничего не делаю асинхронно. Я вызываю только одно обещание, и для этого мне нужно иметь доступ к переменной, которую я определил в своем конструкторе.

Я что-то упускаю.. что это может быть?


person Sean Lindo    schedule 28.04.2015    source источник
comment
Использование второго параметра для forEach, вероятно, самый чистый способ сделать это. См. Как передать контекст анонимной функции forEach().   -  person Qantas 94 Heavy    schedule 28.04.2015
comment
Вы можете использовать bind, но в том, как вы это делаете, нет ничего плохого.   -  person adeneo    schedule 28.04.2015
comment
Пришлось изменить ваш код... Я застрял на целую вечность, думая, что вы имели в виду, что значение this было разным до и после цикла foreach, а не во время :)   -  person James Thorpe    schedule 28.04.2015
comment
Лучше задать вопрос: Почему вы return обещаете forEach обратного вызова? Что вы на самом деле собирались с ними делать?   -  person Bergi    schedule 28.04.2015
comment
Почему ты делаешь new Promise.promsiifyAll -_-?   -  person Benjamin Gruenbaum    schedule 28.04.2015
comment
Вы хотели использовать Promise.each или Promise.map вместо forEach?   -  person Benjamin Gruenbaum    schedule 28.04.2015
comment
@BenjaminGruenbaum Не могли бы вы объяснить мою ошибку, сэр? Re: new Promise.promisfyAll   -  person Sean Lindo    schedule 28.04.2015
comment
@JamesThorpe Спасибо за помощь. Очевидно, это было не доброе утро, я полностью потерял представление о том, где нахожусь, и понял, что попал в петлю. Извините все!   -  person Sean Lindo    schedule 28.04.2015
comment
@sean не стесняйтесь заходить в чат по адресу chat.stackoverflow.com/rooms/17/javascript.   -  person Benjamin Gruenbaum    schedule 28.04.2015