Как ожидать, что значение c будет указано в javascript? - PullRequest
0 голосов
/ 09 марта 2020

Так что я пытался найти свой ответ в Google, но мне не повезло найти его. Мне интересно, как я могу ожидать, что значение будет определено с помощью обещаний, а не методом грубой силы, например, с использованием:

while(true){ Check for condition and then break }

Это был мой первоначальный подход грубой силы, но он, очевидно, не Хорошее решение:

const awaitToken = new Promise((resolve, reject) => {
    while(true){
        if(getState().auth.token){
            resolve(true)
            break;
        }
    }
})

** РЕДАКТИРОВАТЬ: метод getState не является асинхронным, в противном случае это было бы намного проще, и поэтому я реализую это потому, что существует небольшая задержка с момента входа пользователя до появления токена в состоянии избыточности ** Я работаю над реактивным проектом, в котором я хочу реализовать это, однако мой код не имеет значения, потому что я не хочу ответа на конкретный случай c. Буду признателен за любую помощь!

Ответы [ 3 ]

1 голос
/ 09 марта 2020

Вот неблокирующее решение для использования синхронизированных функций простым способом в обещаниях. Дополнительное время ожидания может сэкономить вам много времени ожидания.

let arrivedToken = new Promise((resolve, reject) => {
  /* how often you wanna check? */
  let interval = 20;
    /*how long do you want to wait? */
  let timeOut = 4000;
  let timer = setInterval(() => {
    timeOut -= interval;
    if (timeOut < 1) {
      clearInterval(timer);
      reject(new Error('catching token timed out'));
    }
    let token = getState().auth.token;
    if (token)
            resolve(token);
  }, interval);
};

, чтобы вы могли справиться с успехом или даже с ошибкой:

arrivedToken
    .then(token => {
        /* whatever you want */
    })
    .catch(error => {
        /* handle the timeout */
  })
;
0 голосов
/ 09 марта 2020

Pu sh против Pull

Я собираюсь сделать некоторые предположения, учитывая то, как вы задали свой вопрос: Предположение, что никто не объяснил Pu sh v Вытянуть дихотомию. Чрезвычайно важно понять, чтобы решить подобные проблемы в будущем без сообщества SO.

Обещания и обратные вызовы были разработаны органом ECMA, чтобы позволить разработчикам PULL для результатов асинхронных задач. Вы можете думать о PULL -ing как о том, что вы берете трубку и звоните своему другу, спрашивая его, доставлена ​​ли ваша посылка по его адресу, который вы указали в форме доставки. Очевидно, что вы не будете оставаться на вызове, пока не прибудет пакет, поэтому вам постоянно приходится повторять этот процесс, пока ваш друг не скажет: «Да, ваш пакет прибыл» (например, Promise.resolve(package) || cb('package has arrived')).

Тогда тело ECMA доставило нам ES8. И вместе с этим, методология PU SH, которая решает именно ту проблему, против которой вы бьете свою голову совершенно превосходно, я мог бы добавить. Дихотомия async/await позволяет разработчику больше не поднимать трубку и не звонить своему другу. Вместо этого ваш друг поднимает трубку, звонит вам и говорит: «Эй, чувак, иди забери свои вещи с моего крыльца, оно пришло». Это PU SH. async/await & generators

Больше многословия по async/await теории, если хотите здесь

Решения

function * fetchToken() {
  const { auth } = getToken(); // getToken() is asynchronous and BLOCKs control flow until value is returned.
  yield auth.token;
}

const tokenGen = fetchToken();

const { value: token } = tokenGen().next();
console.log('token: ', token); // [jwt token]

async function fetchToken() {
  const { auth } = await getToken(); // await BLOCK's control flow until the function resolves. 
  return auth.token;
}

const token = fetchToken();
console.log('token: ', token); // [jwt token]
0 голосов
/ 09 марта 2020

Redux позволяет подписаться на магазин. Обратный вызов будет вызываться всякий раз, когда отправляется действие.

Это означает, что вы можете сделать что-то вроде этого:

const awaitToken = new Promise(resolve => {
  if (getState().auth.token) return resolve(true);

  const unsubscribe = subscribe(() => {
    if (!getState().auth.token) return;
    unsubscribe();
    resolve(true);
  });
});

Дополнительную информацию о subscribe можно найти здесь, Вы также можете добавить тайм-аут, но это может зависеть от варианта использования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...