HTTP 调用由于另一个方法调用而被取消,我如何强制阻止第二次调用直到收到 HTTP 响应?
HTTP call gets cancelled due to another method call, how can I force prevent the second call untill the HTTP is response is received?
我正在为 oauth2 执行授权代码流,我在这里做错了一些事情,但我无法真正检测到..
这是我的代码
在app.js
myService.setup().then(function(){...
在service.js
var service = {
setup(options) {
this.processData();
return this.getToken(options);
},
processData(data) {
let response = this._extractURLParams(window.location.href)
if (response.hasOwnProperty("code")) {
return this.handleAuthorizationCode(responseResult);
},
handleAuthorization(codeObject) {
var service= this;
return new Promise((resolve, reject) => {
var xhr = new XMLHttpRequest();
xhr.open("POST", /token, true);
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
var params = 'grant_type=authorization_code&code=' + codeObject.code + '&client_id=client_id&client_secret=secret&redirect_uri=' + codeObject.redirectURi;
xhr.onreadystatechange = function () {
if (xhr.readyState === 4 && xhr.status === 200) {
var responseData = JSON.parse(this.response);
resolve(service.storeToken(responseData));
}
};
xhr.send(params);
});
},
getToken(options) {
let service = this;
return new Promise(function (resolve, reject) {
if(// localStorage has a token) {
resolve(localStorage.getToken()) //dummy text, real code here
} else {
resolve(service.handleRedirectionsFlow(options));
})
},
情况如下
1) 当我访问我的应用程序时,我调用 myService.setup()
2) setup() 方法将调用 processData(),由于 url 将为空,if 条件不会通过,因此我们将调用 getToken()
3) getToken() 将调用一个方法,该方法将构建一个 url 并更改它的位置,以便我们通过授权服务器上的表单进行身份验证,然后我们将在之后重定向回应用程序验证码!
4) 身份验证后,我们将使用类似的内容重定向到应用程序
'url?code=abcasdasdsfdasifsfsfs
5) 现在,processData() 将检测到 url 有代码 属性,我们将调用 handleAuthorizationCode
6) handleAuthorizationCode 将简单地执行 post 请求以获取令牌,然后 onReadyStateChange 我们将调用另一个方法来存储令牌。
7) 现在当我们从setup()中调用getToken()时,此时onreadystatechange还没有从之前的方法中触发,导致我们重做重定向以再次进行身份验证,然后令牌请求得到已取消,我们从不存储它..
有人可以帮我知道我到底应该在哪里放置额外的承诺并解决它以便在触发 onreadystatechange 并存储令牌以避免无限循环后调用 getToken() 吗?
谢谢
如果不能运行很难知道,但是这个怎么样?
var service = {
setup(options) {
return this.processData()
.then(token => token || this.getToken(options));
},
processData(data) {
const response = this._extractURLParams(window.location.href);
return response.hasOwnProperty("code")
? this.handleAuthorizationCode(responseResult)
: Promise.resolve();
},
handleAuthorization(codeObject) {
var service = this;
return new Promise((resolve, reject) => {
var xhr = new XMLHttpRequest();
xhr.open("POST", /token, true);
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
var params = 'grant_type=authorization_code&code=' + codeObject.code + '&client_id=client_id&client_secret=secret&redirect_uri=' + codeObject.redirectURi;
xhr.onreadystatechange = function() {
if (xhr.readyState === 4 && xhr.status === 200) {
var responseData = JSON.parse(this.response);
resolve(service.storeToken(responseData));
}
};
xhr.send(params);
});
},
getToken(options) {
let service = this;
return new Promise(function(resolve, reject) {
if (localStorageHasToken) {
resolve(localStorage.getToken()) //dummy text, real code here
} else {
resolve(service.handleRedirectionsFlow(options));
}
});
}
};
本质上,我们总是processData
一个承诺,即使它是一个立即解决的承诺,在setup
我们等待processData()
承诺解决,然后调用getToken
.
我不确定 service.storeToken(responseData)
return 是什么,但如果令牌已存储,您可以使用它来完全跳过调用 getToken
。
我正在为 oauth2 执行授权代码流,我在这里做错了一些事情,但我无法真正检测到..
这是我的代码
在app.js
myService.setup().then(function(){...
在service.js
var service = {
setup(options) {
this.processData();
return this.getToken(options);
},
processData(data) {
let response = this._extractURLParams(window.location.href)
if (response.hasOwnProperty("code")) {
return this.handleAuthorizationCode(responseResult);
},
handleAuthorization(codeObject) {
var service= this;
return new Promise((resolve, reject) => {
var xhr = new XMLHttpRequest();
xhr.open("POST", /token, true);
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
var params = 'grant_type=authorization_code&code=' + codeObject.code + '&client_id=client_id&client_secret=secret&redirect_uri=' + codeObject.redirectURi;
xhr.onreadystatechange = function () {
if (xhr.readyState === 4 && xhr.status === 200) {
var responseData = JSON.parse(this.response);
resolve(service.storeToken(responseData));
}
};
xhr.send(params);
});
},
getToken(options) {
let service = this;
return new Promise(function (resolve, reject) {
if(// localStorage has a token) {
resolve(localStorage.getToken()) //dummy text, real code here
} else {
resolve(service.handleRedirectionsFlow(options));
})
},
情况如下
1) 当我访问我的应用程序时,我调用 myService.setup()
2) setup() 方法将调用 processData(),由于 url 将为空,if 条件不会通过,因此我们将调用 getToken()
3) getToken() 将调用一个方法,该方法将构建一个 url 并更改它的位置,以便我们通过授权服务器上的表单进行身份验证,然后我们将在之后重定向回应用程序验证码!
4) 身份验证后,我们将使用类似的内容重定向到应用程序 'url?code=abcasdasdsfdasifsfsfs
5) 现在,processData() 将检测到 url 有代码 属性,我们将调用 handleAuthorizationCode
6) handleAuthorizationCode 将简单地执行 post 请求以获取令牌,然后 onReadyStateChange 我们将调用另一个方法来存储令牌。
7) 现在当我们从setup()中调用getToken()时,此时onreadystatechange还没有从之前的方法中触发,导致我们重做重定向以再次进行身份验证,然后令牌请求得到已取消,我们从不存储它..
有人可以帮我知道我到底应该在哪里放置额外的承诺并解决它以便在触发 onreadystatechange 并存储令牌以避免无限循环后调用 getToken() 吗?
谢谢
如果不能运行很难知道,但是这个怎么样?
var service = {
setup(options) {
return this.processData()
.then(token => token || this.getToken(options));
},
processData(data) {
const response = this._extractURLParams(window.location.href);
return response.hasOwnProperty("code")
? this.handleAuthorizationCode(responseResult)
: Promise.resolve();
},
handleAuthorization(codeObject) {
var service = this;
return new Promise((resolve, reject) => {
var xhr = new XMLHttpRequest();
xhr.open("POST", /token, true);
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
var params = 'grant_type=authorization_code&code=' + codeObject.code + '&client_id=client_id&client_secret=secret&redirect_uri=' + codeObject.redirectURi;
xhr.onreadystatechange = function() {
if (xhr.readyState === 4 && xhr.status === 200) {
var responseData = JSON.parse(this.response);
resolve(service.storeToken(responseData));
}
};
xhr.send(params);
});
},
getToken(options) {
let service = this;
return new Promise(function(resolve, reject) {
if (localStorageHasToken) {
resolve(localStorage.getToken()) //dummy text, real code here
} else {
resolve(service.handleRedirectionsFlow(options));
}
});
}
};
本质上,我们总是processData
一个承诺,即使它是一个立即解决的承诺,在setup
我们等待processData()
承诺解决,然后调用getToken
.
我不确定 service.storeToken(responseData)
return 是什么,但如果令牌已存储,您可以使用它来完全跳过调用 getToken
。