在带有参数的jQuery函数中使用async&await

时间:2019-06-06 15:49:16

标签: jquery ajax

我下面有这样的代码(部分代码)。在“第4步”部分之后,代码将继续,并且可能会转到新页面(与saveTokenToUser函数的结果无关。但是,我需要确保saveTokenToUser和{{1 }}在重定向发生之前,呼叫已完成。

当前,尽管函数调用中包含ajaxasync,但我得到了以下结果。我猜我语法有误吗?

  

步骤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也未完成。

1 个答案:

答案 0 :(得分:0)

您的代码呼叫 saveTokenToUser也必须使用await。到目前为止,result收到了承诺,并且不等待该承诺被兑现。

您至少有三个选择:

  1. 如果该代码在async函数中,请await调用saveTokenToUser
  2. 如果不是,但是您可以将其设为async函数(处理对调用它的代码产生的任何影响,并确定要对其进行拒绝处理),然后执行await致电saveTokenToUser
  3. 在调用then的结果上使用catchsaveTokenToUser

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