Как переписать этот запрос, используя синтаксис async / await? - PullRequest
2 голосов
/ 05 августа 2020

Вот задача:

  1. Вам нужно сделать GET-запрос для ресурса: https://jsonplaceholder.typicode.com/posts методом fetch
  2. Сохранить ответ в ответ . json файл
  3. Сохранять только те элементы, где id <20 </li>

Что я написал:

const fetch = require('node-fetch');

const fs = require('fs');
const path = require('path');
const filePath = path.join(__dirname, 'response.json');

fetch('https://jsonplaceholder.typicode.com/posts')
    .then(res => res.json())
    .then(data => {
        const refined = data.filter(item => item.id < 20);
        const stringified = JSON.stringify(refined);

        fs.appendFile(filePath, stringified, err => {
            if (err) {
                throw err;
            }
        });
    });

Как написать такую ​​же выборку, но с синтаксисом async / await?

Ответы [ 2 ]

3 голосов
/ 05 августа 2020
Ключевое слово

await может использоваться только внутри функции async, поэтому вам нужно написать асинхронную c функцию, которая делает запрос API для получения данных

async function fetchData() {
   const response = await fetch('https://jsonplaceholder.typicode.com/posts');
   const data = await response.json();

   const refined = data.filter(item => item.id < 20);
   const stringified = JSON.stringify(refined);
   
   // promise version of appendFile function from fs.promises API
   await fs.appendFile(filePath, stringified);
}

fs В модуле nodeJS есть функции, которые используют обещания вместо обратных вызовов. если вы не хотите использовать версию обратного вызова, вам нужно будет использовать версию обещания функции appendFile.

Вы можете импортировать версию обещания модуля fs как require('fs').promises или require('fs/promises').

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

Боковой совет: Если вы хотите записывать данные в файл в легко читаемом формате, измените

const stringified = JSON.stringify(refined);

на

const stringified = JSON.stringify(refined, null, 4); 
1 голос
/ 05 августа 2020

Нижеприведенный фрагмент может вам помочь (проверено на узле v14)

const fetch = require("node-fetch")

const fs = require("fs")
const path = require("path")
const filePath = path.join(__dirname, "response.json")

async function execute() {
  const res = await fetch("https://jsonplaceholder.typicode.com/posts")
  const data = await res.json()

  const refined = data.filter((item) => item.id < 20)
  const stringified = JSON.stringify(refined)

  fs.appendFile(filePath, stringified, (err) => {
    if (err) {
      throw err
    }
  })
}

execute()
...