首页 文章

js - 两个承诺的一个捕获

提问于
浏览
0

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

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)
})

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

不幸的是,这段代码没有按预期工作:即使 errorCheck 失败,它也会检查 authUser ,但我猜错 errorCheck 应该调用catch并停止执行其他任何操作 .

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

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

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

1 回答

  • 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) .

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

相关问题