92 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
		
		
			
		
	
	
			92 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
| 
								 | 
							
								---
							 | 
						|||
| 
								 | 
							
								title: Await Promises
							 | 
						|||
| 
								 | 
							
								localeTitle: Ожидание обещаний
							 | 
						|||
| 
								 | 
							
								---
							 | 
						|||
| 
								 | 
							
								## Ожидание обещаний
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								В `async` / `await` [операторы](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators) облегчают реализацию многого асинхронного Promises. Они также позволяют инженерам писать более четкий, более сжатый, проверяемый код.
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								Чтобы понять эту тему, вы должны иметь четкое представление о том, как работают [Обещания](https://guide.freecodecamp.org/javascript/promises) .
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								* * *
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								## Основной синтаксис
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								\`\` \`javascript функция медленноResolvedPromiseFunc (строка) { return new Promise (solve => { setTimeout (() => { разрешения (строка); }, 5000); }); }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								асинхронная функция doIt () { const myPromise = ждать медленноResolvedPromiseFunc ("foo"); console.log (myPromise); // "foo" }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								сделай это();
							 | 
						|||
| 
								 | 
							
								```
							 | 
						|||
| 
								 | 
							
								There are a few things to note: 
							 | 
						|||
| 
								 | 
							
								 
							 | 
						|||
| 
								 | 
							
								 * The function that encompasses the `await` declaration must include the `async` operator. This will tell the JS interpreter that it must wait until the Promise is resolved or rejected. 
							 | 
						|||
| 
								 | 
							
								 * The `await` operator must be inline, during the const declaration. 
							 | 
						|||
| 
								 | 
							
								 * This works for `reject` as well as `resolve`. 
							 | 
						|||
| 
								 | 
							
								 
							 | 
						|||
| 
								 | 
							
								 --- 
							 | 
						|||
| 
								 | 
							
								 
							 | 
						|||
| 
								 | 
							
								 ## Nested Promises vs. `Async` / `Await` 
							 | 
						|||
| 
								 | 
							
								 
							 | 
						|||
| 
								 | 
							
								 Implementing a single Promise is pretty straightforward. In contrast, Chained Promises or the creation of a dependency pattern may produce "spaghetti code". 
							 | 
						|||
| 
								 | 
							
								 
							 | 
						|||
| 
								 | 
							
								 The following examples assume that the <a href='https://github.com/request/request-promise' target='_blank' rel='nofollow'>`request-promise`</a> library is available as `rp`. 
							 | 
						|||
| 
								 | 
							
								 
							 | 
						|||
| 
								 | 
							
								 ### Chained/Nested Promises 
							 | 
						|||
| 
								 | 
							
								```
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								Javascript // Первое обещание const fooPromise = rp ("http://domain.com/foo");
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								fooPromise.then (resultFoo => { // Должен дождаться "foo", чтобы разрешить console.log (resultFoo);
							 | 
						|||
| 
								 | 
							
								```
							 | 
						|||
| 
								 | 
							
								const barPromise = rp("http://domain.com/bar"); 
							 | 
						|||
| 
								 | 
							
								 const bazPromise = rp("http://domain.com/baz"); 
							 | 
						|||
| 
								 | 
							
								 
							 | 
						|||
| 
								 | 
							
								 return Promise.all([barPromise, bazPromise]); 
							 | 
						|||
| 
								 | 
							
								```
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								}), затем (resultArr => { // Обрабатываем разрешения «bar» и «baz» здесь console.log (resultArr \[0\]); console.log (resultArr \[1\]); });
							 | 
						|||
| 
								 | 
							
								```
							 | 
						|||
| 
								 | 
							
								### `async` and `await` Promises 
							 | 
						|||
| 
								 | 
							
								```
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								Javascript // Оберните все в асинхронной функции асинхронная функция doItAll () { // Получить данные из конечной точки «foo», но дождаться разрешения console.log (ожидание rp ("http://domain.com/foo"));
							 | 
						|||
| 
								 | 
							
								```
							 | 
						|||
| 
								 | 
							
								// Concurrently kick off the next two async calls, 
							 | 
						|||
| 
								 | 
							
								 // don't wait for "bar" to kick off "baz" 
							 | 
						|||
| 
								 | 
							
								 const barPromise = rp("http://domain.com/bar"); 
							 | 
						|||
| 
								 | 
							
								 const bazPromise = rp("http://domain.com/baz"); 
							 | 
						|||
| 
								 | 
							
								 
							 | 
						|||
| 
								 | 
							
								 // After both are concurrently kicked off, wait for both 
							 | 
						|||
| 
								 | 
							
								 const barResponse = await barPromise; 
							 | 
						|||
| 
								 | 
							
								 const bazResponse = await bazPromise; 
							 | 
						|||
| 
								 | 
							
								 
							 | 
						|||
| 
								 | 
							
								 console.log(barResponse); 
							 | 
						|||
| 
								 | 
							
								 console.log(bazResponse); 
							 | 
						|||
| 
								 | 
							
								```
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								// Наконец, вызовите функцию async doItAll (). then (() => console.log ('Done!'));
							 | 
						|||
| 
								 | 
							
								```
							 | 
						|||
| 
								 | 
							
								The advantages of using `async` and `await` should be clear. This code is more readable, modular, and testable. 
							 | 
						|||
| 
								 | 
							
								 
							 | 
						|||
| 
								 | 
							
								 It's fair to note that even though there is an added sense of concurrency, the underlying computational process is the same as the previous example. 
							 | 
						|||
| 
								 | 
							
								 
							 | 
						|||
| 
								 | 
							
								 --- 
							 | 
						|||
| 
								 | 
							
								 
							 | 
						|||
| 
								 | 
							
								 ## Handling Errors / Rejection 
							 | 
						|||
| 
								 | 
							
								 
							 | 
						|||
| 
								 | 
							
								 A basic try-catch block handles a rejected Promise. 
							 | 
						|||
| 
								 | 
							
								```
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								Javascript async function errorExample () { пытаться { const rejectPromise = ждать Promise.reject («О-о!»); } catch (ошибка) { console.log (ошибка); // «О-о!» } }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								errorExample (); \`\` \`
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								* * *
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								#### Дополнительная информация:
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								*   `await` Операторы [MDN Docs](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/await)
							 | 
						|||
| 
								 | 
							
								*   `async` Оператор функций [MDN Docs](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/async_function)
							 |