在 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
,但无法通过接受 resolve
和 reject
作为 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
原型。
我正在使用本机 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
,但无法通过接受 resolve
和 reject
作为 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
原型。