在 ECMAScript 6 中创建可取消的承诺

Create cancellable promise in ECMAScript 6

我正在使用本机 Promise 像这样使用 superagent 发出 ajax 请求。

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

var reqProm = callAPI();

我想知道的是,我可以将此承诺用于 cancel/abort 提出的请求吗?我认为 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 是只读的。有没有更好的方法来做到这一点?

I'm getting an error saying Promise.prototype is readonly

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

What I am wondering is, can I use this promise to cancel/abort the request made?

而不是 returning 您创建的 new Promise,而是将其存储在 closure 和 return 具有额外方法的 Promise 实例中,该方法具有调用req 上的 abort 方法以及 Promise 的 reject 方法。

作为旁注,在您的第一个示例中,您试图在 new Promise 中调用 resolve,但无法通过接受 resolvereject 作为 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();

您遇到了语义问题。 Promise 与 returns Promise 不是 相同的东西。在您的情况下,请求是您希望可能中止的事情。

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

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

你做错了事。

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

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

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

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

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