Могу ли я приостановить выполнение функции, пока какое-либо значение не будет получено в узле? - PullRequest
0 голосов
/ 10 февраля 2019

Есть ли способ повесить / приостановить функцию в середине ее выполнения, а затем продолжить после обработки нескольких вещей (ввод от пользователя, полученных через socket.io) в узле js?Я знаю, что это плохая практика, и мне нужно использовать обещания, асинхронность / ожидание и т. Д. Однако, в зависимости от функциональности моей программы, мне нужно справиться с этим таким образом.

Мой оригинальный вопрос о том, где я поделился своим кодом, находится здесь: Узловое приложение в интерактивном режиме получает пользовательский ввод от интерфейса переднего плана, приостанавливая текущее выполнение

Ответы [ 4 ]

0 голосов
/ 10 февраля 2019

Вы можете сделать это с async, await и Promise.

function func1(){
  console.log("function 1 is finished")
}
function func2(){
  console.log("function 2 is finished")
}

const thingsHandled = new Promise((res,rej) => {
    func1();
    func2();
    console.log("Every function is done")
    res();
})
   
async function main(){
    await thingsHandled;
    console.log("function is continued");
}
main();
0 голосов
/ 10 февраля 2019

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

0 голосов
/ 10 февраля 2019

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

  var a_few_things_have_been_handled = false;
  handle_a_few_things(); 
  // which returns immediately but has a side effect of 
  // effectively setting a_few_things_have_been_handled to true

  while(!a_few_things_have_been_handled) {
    // do nothing just wait...
    // actually you want to yield to asynchronous threads
    // but you can't do it like this
  }

  the_rest_of_your_program();

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

0 голосов
/ 10 февраля 2019

Вы можете заключить "второй блок" своей функции в вызов setTimeout(), например:

function f()
{
  statement1;
  setTimeout(() => {
    statement2;
  }, 1000);
}
...