我如何访问这个'在Promise.map里面?

时间:2015-04-30 17:03:48

标签: javascript node.js promise bluebird

如我们所知,下面的this指的是window对象。我想知道的是如何在不诉诸this技巧的情况下传递var self=this;上下文。有任何想法吗?我尝试将.bind()添加到第9行的末尾,因此它显示为}).bind(this);,但这也不起作用。

有什么想法吗?

QueueService.prototype.FillCompanyQueue = function(companies) {
    return Promise.map(companies, function (company_batch) {
        var params = {
            Entries: company_batch,
            QueueUrl: Config.get("AWS-Queue.Company")
        };

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

编辑:我标记了它,但应该提到我正在使用Bluebird。

编辑:修正了一个拼写错误。

2 个答案:

答案 0 :(得分:5)

您可以使用Bluebird's bind function

QueueService.prototype.FillCompanyQueue = function(companies) {
    return Promise.resolve(companies).bind(this).map(function(company_batch) {
        var params = {
            Entries: company_batch,
            QueueUrl: Config.get("AWS-Queue.Company")
        };
        return this._sqs.sendMessageBatchAsync(params);
    });
};

如果你不在承诺链的延续之外需要外部环境,我不确定它是否比使用var self=this;技巧更好?" #34;

当然,如果你正在使用ES6,你也可以简单地使用箭头功能:

QueueService.prototype.FillCompanyQueue = function(companies) {
    return Promise.map(companies, (company_batch) => {
        var params = {
            Entries: company_batch,
            QueueUrl: Config.get("AWS-Queue.Company")
        };
        return this._sqs.sendMessageBatchAsync(params);
    });
};

答案 1 :(得分:0)

}).bind(this);绑定了承诺,而不是地图回调,请尝试}.bind(this));

然而,这只是var self = this;

的ES5惯例
QueueService.prototype.FillCompanyQueue = function(companies) {
    return Promise.map(companies, function (company_batch) {
        var params = {
            Entries: company_batch,
            QueueUrl: Config.get("AWS-Queue.Company")
        };

        return this._sqs.sendMessageBatchAsync(params);
    }.bind(this));
};