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

Javascript 在ECMAScript 6中创建可取消的承诺,javascript,promise,cancellation,superagent,Javascript,Promise,Cancellation,Superagent,我使用本机承诺,通过superagent发出ajax请求,如下所示 function callAPI() { return new Promise(function () { request.get('/some.json') .end(function (error, res) { resolve(res); }); }); } var reqProm = callAPI();

我使用本机承诺,通过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是只读的时候出错了。有没有更好的办法

我在说Promise.prototype是只读的时出错

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

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

不要返回您创建的新承诺,而是将其存储在中,并使用一个额外的方法返回承诺实例,该方法可以在req上调用abort方法,还可以调用承诺的reject方法

作为旁注,在第一个示例中,您试图在新承诺中调用resolve,但通过接受resolve和reject函数作为承诺构造函数执行器的参数,无法使其可用

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();

这里有一个语义问题。承诺与回报承诺的东西不是一回事。在您的情况下,请求是您希望潜在中止的内容

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


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

您做了一件错误的事情

return new Promise(function (resolve, reject) {
  this.req = request.get('/some.json')
现在,从函数返回的承诺具有req属性

Promise.prototype.abort = function () {
  this.req.abort();
在任何地方创建的承诺都有使用req字段的中止函数


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

在哪个世界,浏览器是Promise.Promise只读的??我刚刚在Safari、Chrome和Fx中进行了测试,原型绝对是可写的。更准确地说,你不能重新定义Promise.prototype,但你可以向itI添加新属性。我在linting和transpiling时出错了。可能是它设置为严格检查模式,我无法更改。严格模式不应阻止扩展本机构造函数的原型。你的一个预处理工具就是在这里制定规则。你在用什么?嘿!奇怪的是,新的Promisefunction{console.logthis==window;//true};。因此,附加this.req本身是不可能的。有什么想法吗?我也是这样开始的,但我逐渐需要越来越多的。然后诸如此类。显然,每一个被链接的承诺都需要代理。也要放弃原来的承诺。因为它变得非常混乱,我希望有一个更通用的解决方案。