【问题标题】:js - one catch for two promisesjs - 两个承诺的一个捕获
【发布时间】:2018-03-17 01:16:58
【问题描述】:

我正在制作一个应用程序,由于我对 promises 不熟悉,所以我在为 promises 苦苦挣扎。这是我的代码:

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

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

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

我想要实现的是: 如果发生错误(错误返回 false) - 去捕捉。如果没有错误,就去认证用户。如果用户返回 false - 去捕捉。否则任务完成。

任何帮助都将不胜感激。

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

【问题讨论】:

  • 您在检查login 变量值时使用Promise 是否有特定目的?这是一个纯粹的同步活动,因为它是编写的,不需要 Promise。

标签: javascript promise


【解决方案1】:

您需要将发出 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)

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

【讨论】:

  • 所有实施的事情都完成了这项工作 - 谢谢 - 我接受你的回答!
猜你喜欢
  • 2023-02-03
  • 1970-01-01
  • 2018-11-01
  • 2014-11-22
  • 1970-01-01
  • 2021-11-06
  • 2017-11-24
  • 2015-06-05
相关资源
最近更新 更多