0

Можете ли вы остановить код за пределами функции async, используя await? Однако я не хочу, чтобы весь код останавливался. Я хочу контролировать, какой код будет работать.Управление Кодом Коды с Async/Ожидание

Я думаю, что там может быть решением, что-то вроде этого:

var isAsyncRunning = false; 
var currentPromise; 
async function asyncFunc(){ 
    isAsyncRunning = true; 
    //Do some code here 
    currentPromise = promise; //promise was defined inside the code 
    await promise; 
    promise.then(function(){ 
     isAsyncRunning = false; 
    }); 
} 
async function anotherFunction(){ 
    if(!isAsyncRunning){ 
     await currentPromise; 
    } 
    //Do some other code here 
} 

Однако, у меня есть много функций, и не хочу, чтобы применить это к каждой функции, что у меня есть.

Есть ли лучшее решение? Если нет, могу ли я что-нибудь сделать, чтобы сделать это менее трудоемкой?

+0

Что применимо к каждой отдельной функции? Может помочь какой-то фон или пример. – jib

+0

Не каждая функция. Я сказал * контролировать *, что он останавливается, а не применять его ко всем функциям. – MasterBob

+1

вы не можете использовать 'await' внутри функции, которая не установлена ​​как' async' - поэтому 'anotherFunction' недействителен –

ответ

2

Я думаю, что ваше понимание обещаний и async/await неточно. Когда вы выполняете функцию async, ключевое слово await перед обещанием убедитесь, что выполнение кода приостановится до тех пор, пока обещание не будет выполнено или отклонено. Ваш код может быть упрощен:

var currentPromise; 

async function asyncFunc(promise){ 
    // Do some code here 
    return await promise; 
} 

function anotherFunction(){ 
    asyncFunc(currentPromise); 
} 

Когда мы называем return await promise, исполнительный механизм ждет в неблокируемом пути, пока обещание не выполнено или отклонено, а затем возвращает результат в функцию anotherFunction.

Примечание: Если вы хотите выполнить обещания в последовательности, вы можете использовать функцию reduce в bluebird или этого method, если вы предпочитаете ванильный JavaScript.

Приостановка выполнение кода

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

В Javascript вы можете приостановить выполнение в неблокирующим способом с использованием async/await. Например:

function sleep(ms) { 
    return new Promise(resolve => setTimeout(resolve, ms)) 
} 

async function main() { 
    await sleep(1500) 
    console.log('Hello world with delay!') 
} 

main() 

Если я правильно понял, в вашем случае вы хотите приостановить выполнение на основе пользовательского ввода. Вы можете реализовать любой тип логики, который вы хотите. Например, следующая программа ждать пользователя нажать клавишу RETURN:

function waitForUserInput(keyCode) { 
    return new Promise(resolve => 
    document.addEventListener('keydown', (event) => { 
     if (event.keyCode === keyCode) resolve() 
    } 
) 
} 

async function main() { 
    await waitForUserInput(13) 
    console.log('Thank you for your submission!') 
} 

main() 

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

+0

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

+0

@MasterBob Вы можете сделать это с помощью * wait *, но вы не можете полностью приостановить движок Javascript. Это невозможно! Пожалуйста, потратьте некоторое время и прочитайте эту статью: https://developer.mozilla.org/en/docs/Web/JavaScript/EventLoop. Посмотрите также на этот ответ: http://stackoverflow.com/a/2734311/177006 – bman

+0

Думаю, это невозможно, и мне придется использовать мое решение. Меня это беспокоит, потому что теперь даже обычные функции не будут работать в браузерах, которые не поддерживают 'async' /' await'. – MasterBob