Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript .then()在承诺解决之前激发_Javascript_Promise - Fatal编程技术网

Javascript .then()在承诺解决之前激发

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

在我的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) {
    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);
    });
}
我期望发生的是:

  • 向API发送登录请求(这只是为了跳过与当前工作无关的实际登录过程)
  • API返回cookie,允许作为登录用户进行进一步测试
  • 向API发送请求,询问用户是否已通过身份验证
  • API响应确认和_embedded.user对象
  • 应用程序的用户对象属性由来自API响应的数据填充
  • User.name已登录到控制台
  • 尽管步骤6在步骤3之间触发。四,。我找不到原因。我的控制台如下所示(注意上面API对象代码中的console.logs):

    完成后

    开始

    胡特

    完成


    这是什么原因呢?提前感谢。

    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
    相比,您可能还需要考虑使用最近的版本,该版本内置了承诺和更好的错误处理功能

    避免使用in
    GET
    POST
    !另外,它看起来不像是
    regenate
    应该返回一个承诺。
    GET (url, params = null) {
        return this._request('GET', url, params);
    }
    
    POST (url, params = null) {
        return this._request('POST', url, params);       
    }