function CancelToken(executor) {
if (typeof executor !== 'function') {
throw new TypeError('executor must be a function.');
}
var resolvePromise;
//将promise放在CancelToken的实例上(也就是可以通过 config.cancelToken.promise访问到这个promise的实例)
this.promise = new Promise(function promiseExecutor(resolve) {
//将成功的函数赋值给resolvePromise,表明可以在外面去控制promise的状态,什么时候成功
resolvePromise = resolve;
});
var token = this;
//executor函数立即执行,同时传递一个cancel函数这位参数,这个cancel函数还有个参数message,从外面传递进来的,
//在executor函数里面可以立即执行,也可以将cancel函数保存起来,后面去执行,看具体使用场景
executor(function cancel(message) {
if (token.reason) {
// Cancellation has already been requested
return;
}
token.reason = new Cancel(message);
//调用取消函数让上面的promise状态变成成功状态,
resolvePromise(token.reason);
});
}
1.executor函数立即执行,同时传递一个cancel函数这位参数,这个cancel函数还有个参数message,从外面传递进来的
2.在executor函数里面可以立即执行,也可以将cancel函数保存起来,后面去执行,看具体使用场景,下面的代码就是立即执行,也即是在拦截器里面对取消了请求
config.cancelToken = new CancelToken(cancel => cancel('请不要重复提交!'))//取消的是当前的请求(并且不会走到error里)
//config.cancelToken就是CancelToken的实例
if (config.cancelToken) {
// config.cancelToken.promise也就是上面的那个promise实例,当状态变成成功的时看看实际做了什么?实际
config.cancelToken.promise.then(function onCanceled(cancel) {
if (!request) {
return;
}
//也就是在成功的回调里面调用了请求的中断方法
request.abort();
//将cancel的实例传递给请求失败错误的回调,这个error对象就是cancel对象,他有个message,属性就是我们传递进屋的msg
reject(cancel);
// Clean up request
request = null;
});
}