我下面有这样的代码(部分代码)。在“第4步”部分之后,代码将继续,并且可能会转到新页面(与saveTokenToUser
函数的结果无关。但是,我需要确保saveTokenToUser
和{{1 }}在重定向发生之前,呼叫已完成。
当前,尽管函数调用中包含ajax
和async
,但我得到了以下结果。我猜我语法有误吗?
步骤1 第2步, 步骤4, 步骤3
代码
await
更新:
T.J。的以下回答人群,这是我的代码。
JS链接:https://jsfiddle.net/kneidels/8nsyegz3/
alert('Step 1');
// save token if app user:
if (tokenViaApp !== '' ) {
alert('Step 2')
var result = saveTokenToUser(tokenViaApp);
}
alert('Step 4')
async function saveTokenToUser(token) {
await $.ajax({
type: "GET",
// async: false, // deprecated in jQuery 1.8
url: "/includes/notifications/",
data: {
t: token
},
success: function(msg) {
localStorage.token_origin = 'app';
alert('Step 3')
}
});
}
现在我进入控制台的所有内容是:
console.log('Step 1')
(tokenViaApp === '' ? Promise.resolve() : saveTokenToUser(tokenViaApp))
.then(() => {
// Do the redirect
console.log('Step 2');
})
.catch(error => {
// Handle/report error
});
console.log('Step 4');
async function saveTokenToUser(token) {
await $.ajax({
type: "GET",
// async: false,
url: "/includes/notifications/",
data: {
t: token
},
success: function(msg) {
localStorage.token_origin = 'app';
console.log('Step 3')
}
});
}
并且Step 1
Step 4
中的localStorage
行也没有运行(很明显,步骤3也未完成。
答案 0 :(得分:0)
您的代码呼叫 saveTokenToUser
也必须使用await
。到目前为止,result
收到了承诺,并且不等待该承诺被兑现。
您至少有三个选择:
async
函数中,请await
调用saveTokenToUser
async
函数(处理对调用它的代码产生的任何影响,并确定要对其进行拒绝处理),然后执行await
致电saveTokenToUser
then
的结果上使用catch
和saveTokenToUser
#3可能看起来像这样(我遗漏了"Step 2"
,因为我认为这些只是为了调试而已,并且使下面的内容变得有些复杂):
console.log("Step 1");
(tokenViaApp === '' ? Promise.resolve() : saveTokenToUser(tokenViaApp))
.then(() => {
// Do the redirect
console.log("Step 4");
})
.catch(error => {
// Handle/report error
});