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

时间:2015-09-25 09:28:47

标签: javascript promise cancellation superagent

我正在使用原生Promise来制作superagent这样的ajax请求。

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是只读的。有没有更好的方法来做到这一点?

3 个答案:

答案 0 :(得分:3)

  

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

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

  

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

不是返回您创建的new Promise,而是将其存储在closure中,并使用额外的方法返回Promise实例,该方法可以在{{1}上调用abort方法以及Promise的req方法。

作为旁注,在您的第一个示例中,您尝试在reject内拨打resolve但未通过接受new Promiseresolve功能使其可用作为Promise构造函数执行器的参数。

reject

答案 1 :(得分:1)

这里有一个语义问题。 Promise与与返回Promise的东西相同。在您的情况下,请求是您想要中止的事情。

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

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

答案 2 :(得分:0)

你做错了。

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

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

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

任何地方创建的承诺都有使用abort字段的req函数。

您必须创建自己的类,其中包含promice并修改其原型,而不是Promise原型。