如何避免在JavaScript应用程序中丢失“this”上下文?

时间:2015-04-28 12:39:05

标签: javascript node.js promise lodash bluebird

以下是我的代码示例:

<rich:panel header="Informations" style="margin: 20px 0 !important;">
    <h:dataTable id="userLocationList"
        value="#{userLocation.list()}" var="row"
        styleClass="rich-table"
        headerClass="rich-table-subheader rich-table-subheadercell rich-table-thead"
        rowClasses="rich-table-row"
        columnClasses="rich-table-cell,rich-table-cell,rich-table-cell">
        <h:column>
            <f:facet name="header">
                <h:outputText value="Profile" />
            </f:facet>
            <center>
                <h:outputText value="#{row.name}" />
            </center>
        </h:column>
        <h:column>
            <f:facet name="header">
                <h:outputText value="Localizations" />
            </f:facet>
                <h:dataTable id="uLoc" var="c" 
                value="#{home.getLocByProfile(row.idProfile)}">
                    <h:column>
                        <h:outputText value="#{c}" />
                    </h:column>
                </h:dataTable>
        </h:column>
        <h:column>
            <f:facet name="header">
                <h:outputText value="Status" />
            </f:facet>
            <center>
                <h:outputText value="#{row.active ? 'OK' : 'Inactive'}" />
            </center>
        </h:column>
    </h:dataTable>
</rich:panel>

如果我省略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

我觉得有更好的方法来解决这个问题,但我并不完全确定如何使用这些工具。我目前正在使用Bluebird和Lodash,两者都支持绑定。在过去,我通过在Bluebird中执行以下操作来通过var self = this;

this

我无法使用此模式,因为我最初没有做任何异步。我只调用一个promise并且需要能够访问我在构造函数中定义的变量来执行此操作。

我忽略了什么......它可能是什么?

0 个答案:

没有答案