Javascript .then()在承诺解决之前激发
在我的vanilla js项目中,我有以下一系列承诺:Javascript .then()在承诺解决之前激发,javascript,promise,Javascript,Promise,在我的vanilla js项目中,我有以下一系列承诺: API.POST({link to login endpoint}, "email=foo&pass=bar") .then(() => User.initiate(API)) .then(() => console.log(User.name || 'wat')); API对象的POST和GET方法除了请求类型外看起来都相同: GET (url, params = null) { cons
API.POST({link to login endpoint}, "email=foo&pass=bar")
.then(() => User.initiate(API))
.then(() => console.log(User.name || 'wat'));
API对象的POST和GET方法除了请求类型外看起来都相同:
GET (url, params = null) {
console.log("GET start");
return new Promise((resolve,reject) => {
this._request('GET', url, params)
.then(result => resolve(result));
});
}
POST (url, params = null) {
return new Promise((resolve,reject) => {
this._request('POST', url, params)
.then(result => resolve(result));
});
}
。。。以及负责发送请求的_请求方法:
_request (type, url, params = null) {
return new Promise((resolve, reject) => {
var xhr = new XMLHttpRequest();
xhr.responseType = 'json';
xhr.open(type,url,true);
xhr.withCredentials = true;
xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded; charset=UTF-8");
xhr.onload = function(){
if (this.status == 200) {
console.log(type + ' done');
resolve(this.response);
} else {
reject(this.response._status.code);
}
};
xhr.send(params);
});
}
应用程序的用户对象提供“启动”方法,该方法调用API检查用户是否登录。使用肯定响应API返回一个_embedded.user对象,该对象在下一步中用于填充应用程序的用户属性:
initiate(API) {
API.GET({link to authorization check endpoint})
.then(authData => this.regenerate(authData._embedded.user));
},
regenerate(userData) {
this.name = userData.name;
// and so on, for each User property
return new Promise((resolve,reject) => {
resolve(this);
});
}
我期望发生的是:
这是什么原因呢?提前感谢。在
initiate()
在GET和POST方法中也使用promise反模式。因为
\u request()
已经返回了一个承诺,所以不需要在每个请求中创建新的承诺
您所需要的只是:
GET (url, params = null) {
return this._request('GET', url, params);
}
POST (url, params = null) {
return this._request('POST', url, params);
}
有关详细说明,请参阅
与使用
XMLHttpRequest
相比,您可能还需要考虑使用最近的版本,该版本内置了承诺和更好的错误处理功能避免使用inGET
和POST
!另外,它看起来不像是regenate
应该返回一个承诺。
GET (url, params = null) {
return this._request('GET', url, params);
}
POST (url, params = null) {
return this._request('POST', url, params);
}