Для программистов мы должны быть знакомы с асинхронными терминами. В википедии асинхронный в компьютерном программировании означает возникновение событий, не зависящих от основного потока программы, и способы обработки таких событий. В двух словах, асинхронность — это не последовательность или последовательность действий, например:
we want to make a cup of tea, the activities are : a. Boiling water b. Put tea on a glass c. Put some sugar on a glass d. Pouring hot water on a glass e. Mix the water in the glass with a spoon
Однако все вышеперечисленные действия можно выполнять асинхронно, так что во время кипячения воды мы можем положить в стакан немного чая и немного сахара, затем, когда вода закипит, мы можем начать наливать воду в стакан, а затем просто перемешиваем все внутри стакана ложкой.
In javascript we can achieve asynchronous with many ways: a. Asynchronous with callback b. Asynchronous with promise c. Asynchronous with async / await
А. Асинхронно с обратным вызовом
setTimeout(function() { myFunction("test callback async !!!"); }, 3000); function myFunction(value) { console.log(value) }
Основываясь на приведенном выше коде, мы используем myFunction в качестве обратного вызова, поэтому текст «test callback async !!!» будет напечатано в журнале консоли через 3000 мс. Обычно для вызова REST API используется функция обратного вызова, поэтому данные ответа будут представлены на экране, когда ответ API будет успешно получен клиентом. Пример :
function callDummyAPI(myCallback) { fetch("https://catfact.ninja/breeds") .then(response => response.json()) .then(json => printData(json)) .catch(error => { // handle the error console.log(error) }); } function printData(value) { console.log(value); } callDummyAPI(printData)
Объяснение приведенного выше кода заключается в том, что мы используем printData в качестве функции обратного вызова и передаем printData в качестве аргумента метода callDummyAPI. Метод printData будет выполнен после того, как ответ API будет полностью получен клиентом (код javascript).
Б. Асинхронно с обещанием
Promise в javascript сложно освоить. Promise — это оболочка для асинхронных процессов, и обещание более продвинутое, чем асинхронное с обратными вызовами.
There are 3 states of promise. While a Promise object is “pending” (working), the result is undefined. When a Promise object is “fulfilled / resolved”, the result is a value. When a Promise object is “rejected”, the result is an error object.
Мы можем проиллюстрировать обещание потока следующим образом: вы хотите съесть банановый пирог и просите своего младшего брата купить его. Время ожидания, пока ваш младший брат купит банановый торт, называется состоянием ожидания, и в это время вы можете заниматься другими делами, такими как уборка комнаты, чтение и так далее. Состояние, когда ваш младший брат может передать вам банановый пирог, называется «решенным» состоянием, а в противном случае, когда торт закончился, это означает, что ваш младший брат не может выполнить заказ, это называется отклоненным состоянием.
Выполненное/решенное обещание
const myPromise = new Promise((resolve, reject) => { setTimeout(() => { resolve('hi promise thread'); }, 3000); }); myPromise.then( function(value) {console.log(value);} ).catch(error => { console.log('Request failed', error); }); console.log("main thread");
Если обещание находится в разрешенном состоянии, будет выполнено .then(function(value) {console.log(value);}
Отклоненное обещание
const myPromise = new Promise((resolve, reject) => { setTimeout(() => { reject('hi promise thread'); }, 3000); }); myPromise.then( function(value) {console.log(value);} ).catch(error => { console.log('Request failed', error); }); console.log("main thread");
Если обещание находится в состоянии отклонения, будет выполнен код .catch(..
С. Асинхронный с Async/Await
Ключевое слово Await будет ждать, пока не будет возвращено значение обещания (разрешено/отклонено). И только ожидание может использоваться внутри ключевого слова Async. Async/Await — это всего лишь оболочка обещания облегчить программистам выполнение асинхронного кода.
const myPromise = () => { return new Promise(resolve => { setTimeout(() => resolve('hi promise'), 3000) }) }; const callMypromise = async () => { const something = await myPromise() return something + ' , i am calling you' }; callMypromise().then(res => { console.log(res) }).catch(error => { console.log('Request failed', error); }); console.log("main thread");
Основываясь на приведенном выше коде, мы видим цепочку асинхронного выполнения (promise). Основной поток console.log(«основной поток») выполняется первым в ожидании промиса. В первом состоянии обещание находится в состоянии ожидания, и через 3000 мс обещание разрешается, а затем представляет «привет, обещание ..» в браузере.
async function myFunction(){ try{ ddddd("go"); }catch(err){ console.log(err); } bbb("go"); return "I love You !!"; } async function myDisplay() { console.log("hi") await myFunction().then( function(value) { console.log(value) }, function(error) { /* code if some error */ } ); console.log("hi1") } myDisplay();
Источник :
https://www.freecodecamp.org/news/what-is-promise-in-javascript-for-beginners/
https://www.w3schools.com/js/js_promise.asp
https://nodejs.dev/learn/modern-asynchronous-javascript-with-async-and-await