Ожидание выполнения асинхронной функции, которая не принимает обратный вызов и не возвращает обещание, не изменяя другую функцию - PullRequest
0 голосов
/ 13 июня 2019

В настоящее время я пытаюсь добавить некоторые функции в существующее веб-приложение, написанное на JavaScript.Моя проблема в том, что я хочу вызвать функцию, которая снова вызывает некоторые асинхронные функции, и хочу выполнить функцию не раньше, чем будут выполнены все другие функции.

Функция, которую я вызываю, не принимает обратного вызова итакже не возвращает обещание (что, конечно, очень плохая практика).

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

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

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

Итак, переводя это на простой пример, я хотел бы выполнить функцию после того, как функция doSomethingAsync была выполнена без изменения этой функции.

var doSomethingAsync = () => {
  setTimeout(() => { console.log("do Something Async") }, 1000);
};
// do something after doSomethingAsync has been executed ...

Я пытался использовать функцию setTimeout () и ноль миллисекунд, но это не работает, поскольку она выполняется до функции doSomethingAsync, и я знаю, что в этом простом примере.

Есть много вариантов выполнения чего-либо после doSomethingAsync, но мне нужна техника, которая позволяет мне выполнять что-то после doSomethingAsync без изменения этой функции.

Любые советы приветствуются.

Ответы [ 3 ]

1 голос
/ 13 июня 2019

Вы не можете достичь того, чего хотите, не изменив doSomethingAsync. Эта функция немедленно завершается и не оставляет возможности определить, когда это setTimeout заканчивается. Если вы не можете найти какой-то другой побочный эффект для мониторинга, вам не повезло.

Ну, технически было бы легко выполнить что-то сразу после того, как doSomethingAsync завершит выполнение. Это заканчивается почти сразу. Чего вы не можете сделать, так это выполнить что-то после триггера setTimeout. Потому что doSomethingAsync не возвращает никаких связей с тем, что было сделано внутри.

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

Вы можете изменить вышеуказанную функцию как,

var doSomethingAsync = () => {
  setTimeout(() => {
    console.log("do Something Async");
    youWantToExecuteAtLast();
  }, 1000);
};
// do something after doSomethingAsync has been executed ... 

function youWantToExecuteAtLast() {
  alert("This is the end");
};

doSomethingAsync();

Для нескольких звонков,

var counter = 0;
var doSomethingAsync = (timer) => {
  setTimeout(() => {
    console.log("do Something Async : ",(counter+1));
    counter++;
    youWantToExecuteAtLast();
  }, timer);
};
// do something after doSomethingAsync has been executed ... 

function youWantToExecuteAtLast() {
  if(counter === 3)
    alert("Three calls are done");
};

doSomethingAsync(2000);
doSomethingAsync(4000);
doSomethingAsync(6000);
0 голосов
/ 13 июня 2019

Вы, похоже, ищете ключевое слово await.

async function waitForMe() {
    console.log("I take time to execute")
}

async function waitsForOthers() {
    console.log("I am going to print right now")
    await waitForMe() //***
    console.log("Now that that's done, I am going to print")
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...