我正在使用原生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是只读的。有没有更好的方法来做到这一点?
答案 0 :(得分:3)
我收到一条错误,说Promise.prototype是只读
我认为这不是真的。你收到的错误是什么?
我想知道的是,我可以使用此承诺取消/中止所提出的请求吗?
不是返回您创建的new Promise
,而是将其存储在closure中,并使用额外的方法返回Promise实例,该方法可以在{{1}上调用abort
方法以及Promise的req
方法。
作为旁注,在您的第一个示例中,您尝试在reject
内拨打resolve
但未通过接受new Promise
和resolve
功能使其可用作为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
原型。