2

我正在使用 nativePromise来发出这样的 ajax 请求superagent

function callAPI() {
    return new Promise(function () {
        request.get('/some.json')
            .end(function (error, res) {
                resolve(res);
            });
    });
}

var reqProm = callAPI();

我想知道的是,我可以使用这个承诺来取消/中止提出的请求吗?我认为应该有Promise.prototype如下方法。

function callAPI() {
    new Promise(function (resolve, reject) {
        this.req = request.get('/some.json')
            .end(function (error, res) {
                resolve(res);
            });
    });
}

Promise.prototype.abort = function () {
 this.req.abort();
} 

但是,我收到一条错误消息,说 Promise.prototype 是只读的。有没有更好的方法来做到这一点?

4

3 回答 3

3

我收到一条错误消息,说 Promise.prototype 是只读的

我认为这不是真的。您收到的错误是什么?

我想知道的是,我可以使用这个承诺来取消/中止提出的请求吗?

不要返回new Promise你创建的,而是将它存储在一个闭包中,并返回一个带有额外方法的 Promise 实例,该方法具有调用该abort方法的范围req以及rejectPromise 的方法。

作为旁注,在您的第一个示例中,您试图resolve在您的内部调用,new Promise但没有通过接受resolveandreject函数作为 Promise 构造函数执行器的参数来使其可用。

function callAPI() {
    let _reject;
    let _req;

    let promise = new Promise(function (resolve, reject) {
        _reject = reject;
        _req = request.get('/some.json').end(function (error, res) {
            resolve(res);
        });
    });

    promise.abort = function () {
        _req.abort();
        _reject();
    };

    return promise;
}

let call = callAPI();

call.abort();
于 2015-09-25T09:42:56.510 回答
1

您在这里遇到了语义问题。Promise返回 Promise 的事物不同。在您的情况下,请求是您可能要中止的事情。

如果有的话,Promise 代表的是响应,而不是请求。取消回复是没有意义的,不是吗?

有意义的是,如果您有一个表示请求的对象,带有 abort() 方法,并且调用该方法将拒绝相关的 Promise。

于 2015-09-25T09:43:04.990 回答
0

你在做错事。

return new Promise(function (resolve, reject) {
  this.req = request.get('/some.json')

现在从您的函数返回的承诺具有该req属性。

Promise.prototype.abort = function () {
  this.req.abort();

并且在任何地方创建的 Promise都具有abort使用req字段的功能。

您必须创建自己的继承自 promice 的类并修改其原型,但不能修改Promise原型。

于 2015-09-25T10:00:19.513 回答