承诺和余烬的奇怪错误

时间:2017-01-19 13:39:01

标签: javascript jquery ember.js promise

我有以下函数,它返回身份验证的承诺

  this.get('session').authenticate('authenticator:custom', {'identification': identification, 'password': password})
    .then((data)=>{
      console.log(data); //Undefined <- here is my problem.
    })
    .catch((reason) => {
      console.log(reason); // It works, when pass bad password!
      this.set('errorMessage', reason.error);
    });

当我打电话给它并传递好的用户名和密码时,它会返回&#34; undefined&#34;,但是当我通过不良属性时,我的拒绝&#34;工作得很好。有人知道为什么我的&#34;然后&#34;没有返回预期的输出?

#include <iostream>

#include <PvSystem.h>
#include <PvInterface.h>
#include <PvDevice.h>

int DeviceFinding()
{
    PvSystem lSystem;
    return 0;
}


int main()
{
    std::cout << "Application start" << std::endl;
    //DeviceFinding();

    return 0;
}

1 个答案:

答案 0 :(得分:1)

首先,$ .ajax返回一个jQuery Promise,这些日子比原生Promise好99.999% - 所以不需要在Promise中包装$ .ajax

其次,.then接受两个回调参数,onfullfilled和onrejected,这两个回调只接收一个参数 - 你的onrejected回调永远不会有状态和错误参数 - 所以代码有缺陷

在onfullfilled回调中,参数是一个数组,是你在$ .ajax成功调用中得到的[result,status,jqXHR]

同样,在onrejected回调中,参数是一个数组,为[jqXHR,status,errorThrown]

鉴于此,可以编写验证函数

authenticate: function(options) {
    return $.ajax({
        url: this.tokenEndpoint,
        type: 'POST',
        headers: {'Content-Type': 'application/json', 'Accept-Encoding': 'gzip, deflate'},
        data: JSON.stringify({
          username: options.identification,
          password: options.password
        })
    })
    .then(function(arr) {
            var response = arr[0];
            console.log(response);
            // return instead of resolve
            return({
                lastLoginDate: response.lastLoginDate,
                login: response.login,
                name: response.name,
                role: response.role,
                token: response.id_token
            });
        }, function(arr) {
            var xhr = arr[0], status = arr[1], error = arr[2];

            if(error !== undefined) {
                console.log(error);
            }
            var response = xhr.responseText;
            // return a rejection - could "throw response" instead
            return Promise.reject(response);
        }
    );
}

和FYI - ES2015 +你可以写

.then(function([response, status, xhr]) {
.....
}, function([xhr, status, error]) {
....