Asyn c с вызовом for и callback: - PullRequest
       10

Asyn c с вызовом for и callback:

1 голос
/ 30 апреля 2020

Итак, часы и часы я ломал голову, чтобы заставить работать эту асин c схему:

1) У меня есть сообщение функции подготовки, которое асин c, так как оно должно получить скачать вложение

2) У меня есть функция отправки сообщения, которая вызывает API Gmail и отправляет подготовленное сообщение. Эта функция возвращает функцию обратного вызова, которую я готов использовать onSuccess

3) У меня есть al oop, для которого вызывается эта функция sendMessage, которая вызывает функцию preparemessage

Все работает как положено, l oop создает N вызовов с N ответами. Однако функция обратного вызова, очевидно, настроена раньше и получает результат последнего значения в для.

Это часть кода:

arrayOfMessagesToBeSent=[{msg1},{msg2}...] (got from the store)

for (const x of arrayOfMessagesToBeSent) {

store.actions.gapi.sendMessage(
        await store.actions.mailing.prepareMsg(
          {messageStuf}     

        ),
        (answer) => {
        console.log("call:", x.id);
        store.actions.mailing.sendCallback(answer, x.id);
      };
      );

}

После завершения подготовки сообщения оно отправляется. Я получаю один действительный ответ на каждое отправленное письмо. Однако l oop для продолжает работать в фоновом режиме и переопределяет это значение x.id

store.actions.mailing.sendCallback (answer, x.id); => Ответ следует за хорошим потоком => Ответ различен для каждого сообщения => x.id переопределяется и при каждом выполнении этой функции получает только x.id

Знаете ли вы, как я могу синхронизировать Это? Таким образом, в основном я хочу, чтобы функция обратного вызова (или эта переменная x.id) ожидала окончания подготовки сообщения.

Вариант A: Лучший: сообщения готовятся, когда отправляются другие. Это было бы лучшим решением

Вариант B: Если это невозможно, по крайней мере, поток:

1) подготовить 2) отправить 3) обратный вызов и затем go со вторым сообщением 1) подготовить 2) отправить 3) обратный вызов ... было бы достаточно

Примечание: я не хочу использовать обещание всех с .map (). Я не хочу подготавливать ВСЕ сообщения, а затем отправлять ВСЕ сообщения, для моего варианта использования лучше было бы использовать al oop, а вариант B.

Спасибо!

1 Ответ

0 голосов
/ 30 апреля 2020

Так что, думаю, я мог бы получить вариант A, используя обещание. Все. Я думал, что функции будут выполнены, как только все обещания будут решены ...

Но пока что я решил это уже (вариант B) благодаря @Bergi. Просто обещаю этот уродливый обратный вызов, и теперь я могу просто сделать это шаг за шагом, как это:

  const MSG = await store.actions.mailing.prepareMsg(
    {msg stuff}
  );
  const answer = await store.actions.gapi.sendMessagePromise(MSG);
  const doStuff = store.actions.mailing.sendCallback(answer, x.id);

Ни одно сообщение не готовится, пока не отправлено первое, но оно в порядке:)

...