如何使用异步/等待语法重写此请求?

时间:2020-08-05 16:25:47

标签: javascript async-await

这是任务:

  1. 您需要使用获取方法对资源https://jsonplaceholder.typicode.com/posts进行GET请求
  2. 将响应保存到response.json文件
  3. 仅保存ID <20的那些项

我写的是什么

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 个答案:

答案 0 :(得分:3)

await关键字只能在async函数内部使用,因此您需要编写一个异步函数来发出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);
}
nodeJS的

fs模块具有使用promise而不是回调的函数。如果您不想使用回调版本,则需要使用appendFile函数的Promise版本。

您可以将fs模块的承诺版本导入为require('fs').promisesrequire('fs/promises')

要处理错误,请确保调用此函数的代码具有catch块,以捕获和处理可能从该函数引发的任何错误。您还可以使用try-catch块将代码包装在此函数中,以处理该函数内部的错误。


侧面提示:如果您想以易于阅读的格式在文件中写入数据,请更改

const stringified = JSON.stringify(refined);

const stringified = JSON.stringify(refined, null, 4); 

答案 1 :(得分:1)

以下代码段可以为您提供帮助(在节点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()