我正在制作一个应用程序,因为我是新的承诺,我正在努力与承诺 . 这是我的代码:
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 回答
您需要将使得ajax请求的Promise放入您在错误检查通过时调用的函数中 . 一旦你定义了promise,promise中的函数就会运行 . 这就是每次都进行身份验证的原因 . 例如,这会立即运行
console.log
:你想要更像这样的东西:
然后你就可以使用它:
另外两件事:
我不太使用jquery,但我相信
$.ajax()
会返回一个承诺,所以我不需要将它包装在另一个承诺中 . 你可以从函数中return $.ajax(//...etc)
.由于您的登录检查代码不是异步的,您实际上并不需要承诺,您只需创建一个返回布尔值的函数,并为自己节省一些代码和复杂的代码 .