# Async/Await Javascript Full Example (ok)

Lession 1:&#x20;

1. [Write an Asynchronous Function with async/await](https://github.com/mariusschulz/egghead-async-await/tree/master/lesson-1)

package.json

```
{
  "name": "egghead-async-await",
  "version": "1.0.0",
  "author": "Marius Schulz",
  "license": "MIT",
  "dependencies": {
    "bluebird": "^3.5.0",
    "node-fetch": "^1.6.3"
  },
  "scripts": {
    "build:8": "tsc -p ./lesson-8"
  },
  "devDependencies": {
    "typescript": "^2.3.0-dev.20170404"
  }
}
```

async.js trả giá trị bên trong

```
const fetch = require("node-fetch");
async function showGitHubUser(handle) {
  const url = `https://api.github.com/users/${handle}`;
  const response = await fetch(url);
  const user = await response.json();
  console.log(user.name);
  console.log(user.location);
}
showGitHubUser("phamngoctuong");
```

![](https://2494213435-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LYjAG13rAPdbArSfRyB%2Fuploads%2F76n1utXKAb9Rp04NJtcS%2FScreenshot_1.png?alt=media\&token=3c27b83c-e5d2-4e9d-a2d3-c5f7d1bc137f)

Lesson 2:&#x20;

1. [Call an Asynchronous Function in a Promise Chain](https://github.com/mariusschulz/egghead-async-await/tree/master/lesson-2)

async.js trả giá trị bên ngoài

```
const fetch = require("node-fetch");

async function showGitHubUser(handle) {
  const url = `https://api.github.com/users/${handle}`;
  const response = await fetch(url);
  return await response.json();
}

showGitHubUser("phamngoctuong").then(user => {
  console.log(user.name);
  console.log(user.location);
});
```

![](https://2494213435-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LYjAG13rAPdbArSfRyB%2Fuploads%2FbeGAHp4TlxzmOuXhYd5P%2FScreenshot_2.png?alt=media\&token=954b6a6e-52c6-48d3-aba4-b264d3ff5c8b)

Lesson 3:

1. [Convert Any Function into an Asynchronous Function](https://github.com/mariusschulz/egghead-async-await/tree/master/lesson-3)

```
const fetch = require("node-fetch");
class GitHubApiClient {
  async fetchUser(handle) {
    const url = `https://api.github.com/users/${handle}`;
    const response = await fetch(url);
    return await response.json();
  }
}
(async () => {
  const client = new GitHubApiClient();
  const user = await client.fetchUser("phamngoctuong");
  console.log(user.name);
  console.log(user.location);
})();
```

![](https://2494213435-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LYjAG13rAPdbArSfRyB%2Fuploads%2FgE2yq2DcWsvjpWUc7yzv%2FScreenshot_3.png?alt=media\&token=e2746740-de68-4cbe-b973-7ddc9c28da3f)

Lesson 4:&#x20;

1. [Handle Errors in Asynchronous Functions](https://github.com/mariusschulz/egghead-async-await/tree/master/lesson-4)

```
const fetch = require("node-fetch");
async function fetchFromGitHub(endpoint) {
  const url = `https://api.github.com${endpoint}`;
  const response = await fetch(url);
  const json = await response.json();
  if (response.status != 200) {
    throw Error(json.message);
  }
  return json;
}
async function showGitHubUser(handle) {
  try {
    const user = await fetchFromGitHub(`/users/${handle}`);
    console.log(user.name);
    console.log(user.location);
  } catch (error) {
    console.error(`Error: ${error.message}`);
  }
}
showGitHubUser("phamngoctuong-sai");
```

![](https://2494213435-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LYjAG13rAPdbArSfRyB%2Fuploads%2FDNA7WVSKWxXZ868NvVEm%2FScreenshot_4.png?alt=media\&token=fe3603e8-7603-44b1-8490-d77b02f74058)

Lesson 5:&#x20;

1. [Await Multiple Promises Sequentially or Concurrently](https://github.com/mariusschulz/egghead-async-await/tree/master/lesson-5)

```
const fetch = require("node-fetch");
async function fetchFromGitHub(endpoint) {
  const url = `https://api.github.com${endpoint}`;
  const response = await fetch(url);
  return await response.json();
}
async function showUserAndRepos(handle) {
  const userPromise = fetchFromGitHub(`/users/${handle}`);
  const reposPromise = fetchFromGitHub(`/users/${handle}/repos`);
  const user = await userPromise;
  const repos = await reposPromise;
  console.log(user.name);
  console.log(`${repos.length} repos`);
}
showUserAndRepos("phamngoctuong");
```

![](https://2494213435-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LYjAG13rAPdbArSfRyB%2Fuploads%2FLp7cZTlPTDGUJiRpNp0o%2FScreenshot_6.png?alt=media\&token=d44c39b2-0fb8-43fa-931c-f4596b58a684)

Lesson 6:&#x20;

1. [Await Multiple Promises Concurrently with Promise.all()](https://github.com/mariusschulz/egghead-async-await/tree/master/lesson-6)

```
const fetch = require("node-fetch");
async function fetchFromGitHub(endpoint) {
  const url = `https://api.github.com${endpoint}`;
  const response = await fetch(url);
  return await response.json();
}
async function fetchUserAndRepos(handle) {
  const [user, repos] = await Promise.all([fetchFromGitHub(`/users/${handle}`), fetchFromGitHub(`/users/${handle}/repos`)]);
  console.log(user.name);
  console.log(`${repos.length} repos`);
}
fetchUserAndRepos("phamngoctuong");
```

![](https://2494213435-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LYjAG13rAPdbArSfRyB%2Fuploads%2FYZPIKaCi8ayIsOY5tw6i%2FScreenshot_7.png?alt=media\&token=64e86a05-515c-498b-a6a3-889f6c6521bf)

Lesson 7:&#x20;

1. [Use the await Operator with Any Thenable](https://github.com/mariusschulz/egghead-async-await/tree/master/lesson-7)

Trong JavaScript, thenable là một đối tượng có hàm then(). => Mọi lời hứa đều là thenable, nhưng không phải mọi điều tốt đẹp đều là promises.&#x20;

```
const Bluebird = require("bluebird");
async function main() {
  console.log("Working ...");
  await Bluebird.delay(2000);
  console.log("Done.");
}
main();
```

![](https://2494213435-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LYjAG13rAPdbArSfRyB%2Fuploads%2Fo3tbCYmHnFqRJm7gM9gZ%2FScreenshot_8.png?alt=media\&token=a6061b5e-3ce3-4bf1-a7bf-d9e4144027f6)

{% embed url="<https://app.gitbook.com/o/-LYjAG1--qK4zFZOXpzU/s/-LYjAG13rAPdbArSfRyB/thenables-in-javascript-phuc-vu-cho-bai-viet-tren-ok>" %}

Lesson 8:&#x20;

1. [Iterate Asynchronously with the for-await-of Loop](https://github.com/mariusschulz/egghead-async-await/tree/master/lesson-8)

```
Symbol.asyncIterator = Symbol.asyncIterator || Symbol("asyncIterator");
const delay = (ms) => new Promise(resolve => {
  setTimeout(resolve, ms);
});
async function* someGenerator() {
  await delay(1000);
  yield 1;
  await delay(1000);
  yield 2;
  await delay(1000);
  yield 3;
}
async function main() {
  for await (const value of someGenerator()) {
    console.log(value);
  }
}
main();
```

![](https://2494213435-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LYjAG13rAPdbArSfRyB%2Fuploads%2F4wyPLBVQvPkQO125ilYX%2FScreenshot_9.png?alt=media\&token=f6d4dabd-6949-411f-ac3f-93ab3b2214bd)
