我正在制作一个应用程序,因为我是新的承诺,我正在努力兑现承诺。这是我的代码:
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}
答案 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)
。
由于您的登录检查代码不是异步的,您实际上并不需要承诺,您只需创建一个返回布尔值的函数,并为自己节省一些代码和复杂的代码。