используя async & await в функции jQuery с параметром - PullRequest
0 голосов
/ 06 июня 2019

У меня есть такой код ниже (частичный код). После части «шаг 4» код продолжается и может перейти на новую страницу (не связанную с результатом функции saveTokenToUser. НО - я должен быть уверен, что вызовы saveTokenToUser и ajax в ней имеют завершено до того, как произойдет перенаправление.

В настоящее время я получаю следующий результат, несмотря на наличие async и await в вызове функции. Я предполагаю, что у меня просто неправильный синтаксис?

Шаг 1, Шаг 2, Шаг 4, Шаг 3

Код

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

UPDATE:

Следующий ответ T.J. Краудер, теперь это мой код.

JS FIDDLE LINK: https://jsfiddle.net/kneidels/8nsyegz3/

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 в success: function(msg) тоже не работает (это очевидно, что шаг 3 также не выполняется.

1 Ответ

0 голосов
/ 06 июня 2019

Ваш код для вызова saveTokenToUser также должен использовать await. Как и сейчас, result получает обещание и не ждет, пока это обещание будет выполнено.

У вас есть как минимум три варианта:

  1. Если этот код находится в функции async, await вызов saveTokenToUser
  2. Если это не так, но вы можете сделать ее функцией async (обрабатывая любой эффект, который влияет на вызывающий ее код, и обязательно обрабатывать отклонения от него), сделайте это и await вызов saveTokenToUser
  3. Используйте 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
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...