在承诺中控制这个值

时间:2015-02-26 12:03:39

标签: javascript promise q

我正在包装XMLHttpRequest的部分功能。我将延期决议附加到被解雇的事件onload。 IIUC XMLHttpRequestthis调用的回调中设置XMLHttpRequest的值,以包含响应详细信息(响应文本,状态代码等)。

但我使用的是qthis的值在延迟解决方案的某处丢失了。如何确保将响应详细信息传播到使用promise then重新注册的回调?

XMLHttpRequestWrapper.prototype.get = function(url) {
    var deferred = q.defer();
    var request = new XMLHttpRequest();

    request.onload = function() {
        // this now contains the response info
        deferred.resolve.apply(this, arguments); // 'this' is lost in the internals of q :(
    };
    request.onerror = function() {
        deferred.reject.apply(this, arguments);
    };

    request.open('GET', url, true);
    request.send();

    return deferred.promise;
}

1 个答案:

答案 0 :(得分:1)

  

this的值在延迟的分辨率中丢失了。

The spec要求在没有任何this值的情况下调用promise回调。这就是resolvereject甚至不接受参数的原因。如果回调想要使用某些this,则需要take care of that本身。

  

如何确保将响应详细信息传播到使用promise进行重新注册的回调?

cannot fulfill a promise with multiple values - 您尝试使用apply是徒劳的。如果您希望回调需要访问所有详细信息,则应使用完整的request对象而不是.result来解决承诺。