js - 两个承诺的一个捕获

时间:2018-03-17 01:16:58

标签: javascript promise

我正在制作一个应用程序,因为我是新的承诺,我正在努力兑现承诺。这是我的代码:

let error = null;
let login = $('#inputLogin').val();

let errorCheck = new Promise(function (resolve, reject) {
    if ( login === "" ) { error = "no login!"; }
    if ( error !== null ) { 
        error = { status: false, reason: error, result: null }; 
        reject(error) 
    } else { 
        resolve() 
    }
})

let authUser = new Promise(function(resolve, reject) { 
    $.ajax( 
        {   
            url: "src/game/Action.php", 
            method: "POST",
            data: { action: "createUser", login: $('#inputLogin').val(), pass: $('#inputPass').val() }
        }
    ).done(function (data) {
        let response = JSON.parse(data);
        if ( !response.status ) {
            reject(response);
        } else {
            resolve()
        }
    })
})

errorCheck.then(function() {
    console.log('no error.. go on..')
    return authUser;
}).
then(function () {
    console.log('everything is fine')
}).
catch(function (error) {
    console.log('error: ' + error.status)
})

如您所见,有两种验证:第一种检查登录字段是否为空。如果它为空,则创建一个具有状态和原因变量的对象,并拒绝承诺。如果没问题(没有错误发生)它开始检查async ajax call theat检查用户是否已经在数据库中。这将返回JSON字符串,该字符串被解析为与错误对象类似的对象。如果此对象的状态为false,它也会拒绝其自己的承诺。否则一切正常,用户已添加到数据库中。

不幸的是,此代码无法按预期工作: 它检查authUser即使errorCheck失败,但我猜错误errorCheck应该调用catch并停止执行其他任何操作。

我想要达到的目标是: 如果发生错误(错误返回false) - 转到catch。如果没有错误,请验证用户身份。如果用户返回false - 去捕获。否则任务完成。

任何帮助都不仅仅是值得赞赏的。

PS:我还需要提一下,authUser返回false我在控制台中收到错误: Uncaught (in promise) {status: false, reason: "user already in db", result: null}

1 个答案:

答案 0 :(得分:0)

您需要将使用ajax请求的Promise放入您在错误检查通过时调用的函数中。一旦你定义了promise,promise中的函数就会运行。这就是每次都要进行身份验证的原因。例如,这会立即运行console.log

var promsie = new Promise(function(resolve, reject) {
    console.log("this runs")
})

你想要更像这样的东西:

function authUser() {
    return  new Promise(function(resolve, reject) { 
        $.ajax( )
        // ...etc
    })
}

然后你就可以使用它:

errorCheck.then(function() {
    console.log('no error.. go on..')
    return authUser()
})

另外两件事:

我不太多使用jquery,但我相信$.ajax()会返回一个承诺,所以我认为你不需要将它包装在另一个承诺中。你可以从函数中return $.ajax(//...etc)

由于您的登录检查代码不是异步的,您实际上并不需要承诺,您只需创建一个返回布尔值的函数,并为自己节省一些代码和复杂的代码。