Автор оригинала: Theresa Mostert.
Поскольку JavaScript развился и изменился в течение последних 5 лет, я нашел различные способы выполнения асинронных операций I.E. При выполнении запроса на данные в базу данных, не проживающую на одном и том же машине, что и приложение; или при вызове внешнего API, используемого приложением.
С широким разнообразием библиотек JavaScript на выбор, разработчики оказываются в положении, где они должны выбрать лучший способ обрабатывать асинхронные связи – создание запросов и обращения с ответами серверов и/или баз данных. Работая с различными приложениями в течение нескольких лет, мне приходилось работать с парой разных реализаций такого типа операции, и я стремился сделать краткое изложение некоторых моих собственных результатов здесь, возможно, чтобы получить некоторую перспективу. Кал
Вызов спины
Самая известная форма функции обратной связи вы, вероятно, будете знакомы, наверное, выглядит что-то подобное:
function myJSCallback() { alert(this.message); }; var receiver = { message: 'hi there!' }; var callback = funcPtrType(myJSCallback, receiver); // alerts with 'hi there' when the callback is invoked
Это известно как js-ctype в кругах JavaScript. Хотя это (в документации MDNS) была отмечена как устаревшая, большинство других форм связи имеют свои корни здесь, и поэтому лучше всего начать с объяснения, почему это/было так полезно/важно.
JS-CTYPES фактически возникли с API операционной системы и взаимодействиями между операционной системой и приложениями. Для связи между браузером и приложением Windows большие поставщики разработали серию технологий вместе с основной API операционной системы – вы, вероятно, были бы знакомы с E.g. ActiveX Controls и или .NET Framework. Мы можем использовать JavaScript для доступа к методам и конечными точками, выставленными этими технологиями.
С API, выставленными в Интернете, сообщения отправляются с компьютера на компьютер, используя основу для отдыха через http. Вот где все интересны, потому что запросы, отправленные через http, довольно уязвимы после моды; Таким образом, программисты должны защищать их и обеспечить, чтобы запросы достигли своего назначения со всеми их данными.
Так как он будет работать с запросом JS-CTYPE выше; это то, что когда этот запрос получен приемным приложением, он будет проходить через данные; И однажды завершив свою работу, ответит, запустив функцию обратной связи. Это означает, что функция выше будет предупреждать «Привет там» после запуска кода вызова. Это эффективно в определенной степени. Но проблемы начались, когда люди начали спрашивать: было ли мое сообщение отправлено в TACT; была завершена операция; И т. Д. Эти проблемы были решены и обещания и асинхн/ждут результата. И, конечно же, некоторые из этих ситуаций, будучи веб-конкретными, означают, что мы также должны получить домен, специфичный с нашими ссылками.
Обещания
Согласно документам MDN, обещание является объектом, который представляет собой неудачу или завершение асинхронной операции:
Как вы увидите в чертеже, включенный (вежливый MDN) и в коде ниже;
Наш код оказывает обещание нашим пользователям в сообщении, отправленном, чтобы предоставить им ожидаемый результат. Запрос еще не выполнен или не доверен (отклонен). Если отклонено, мы отправляем их сообщение о проваре, если успешно, операции могут быть завершены (например, данные возвращаются). Но возвращаемое сообщение содержит другое обещание. Второе обещание представляет собой завершение не только на нашем первом вызове метода, но и на успешном или сбое или FailureCallback, который может быть другими асинхронными функциями, возвращающими обещание.
Обещание приходит с некоторыми гарантиями:
- Обратные вызовы никогда не будут вызываться до завершения текущего прогона цикла событий JavaScript.
- Обратные вызовы, добавленные с. Затем даже после успеха или неудачи асинхронной операции будут называться, как указано выше.
- Несколько обратных вызовов могут быть добавлены, вызывая. Затем несколько раз выполняются независимо в порядке ввода.
// Promise approach function getJSON(){ return new Promise( function(resolve) { axios.get('https://tutorialzine.com/misc/files/example.json') .then( function(json) { // The data from the request is available in a .then block // We return the result using resolve. resolve(json); }); }); }
Наиболее непосредственным преимуществом использования обещаний можно увидеть в этом примере более сложной цепочки функций:
doSomething(function(result) { doSomethingElse(result, function(newResult) { doThirdThing(newResult, function(finalResult) { console.log('Got the final result: ' + finalResult); }, failureCallback); }, failureCallback); }, failureCallback);
Async/a ждать
С async/ждут мы смотрим на те же операции и функциональность. Мы хотим получить какой-нибудь файл JSON с сервера. Таким образом, мы пишем функцию, которая использует заранее определенную библиотеку, например угловой или Библиотека Axios Для выполнения HTTP Get или Post запрос к конечной точке E.g. API. Мы должны ждать, пока сервер ответит, поэтому, естественно, этот HTTP-запрос будет асинхронным. Вот пример кода:
// Async/Await approach // The async keyword will automatically create a new Promise and return it. async function getJSONAsync(){ // The await keyword saves us from having to write a .then() block. let json = await axios.get('https://tutorialzine.com/misc/files/example.json'); // The result of the GET request is available in the json variable. // We return it just like in a regular synchronous function. return json; }
Ключевое слово ASYNC в нашей декларации создает обещание и ждут, когда размещается перед вызовом обещания, заставляет остаток кода дождаться до тех пор, пока это обещание заканчивается и возвращает результат. Ждут работает только с обещаниями, он не работает с обратными вызовами. Await можно использовать только внутри асинхронных функций.
Вот более сложный пример, но в его использовании, немного легче объяснить, что происходит под капотом. Существует также один или два улучшения кода в:
async function getABC() { let A = await getValueA(); // getValueA takes 2 second to finish let B = await getValueB(); // getValueB takes 4 second to finish let C = await getValueC(); // getValueC takes 3 second to finish return A*B*C; } async function getABC() { // Promise.all() allows us to send all requests at the same time. let results = await Promise.all([ getValueA, getValueB, getValueC ]); return results.reduce((total,value) => total * value); }
Чтобы отправить все запросы одновременно обещание. Все () требуется. Это убедитесь, что у нас еще есть все результаты, прежде чем продолжить, но асинхронные звонки будут стрелять параллельно, а не один за другим.
Хорошо; Это в значительной степени длинный разум для простой концепции, в которую может быть введена много сложности. Но если вы используете спокойную реализацию, я не могу представить, что вы получаете, по крайней мере, не менее базового понимания этих концепций.
Надеюсь это поможет!
См. Следующие ссылки для дальнейшего чтения (у некоторых есть некоторые действительно интересные проблемы головоломки, которые стоит посмотреть):