NodeJS 等待 axios+nedb 函数 async/await 到 运行 下一个查询

NodeJS wait for an axios+nedb function async/await to run next query

我想在 NodeJS 脚本中使用 Axios + nedb 将 API 中的数据收集到本地文件中。这是我到目前为止所做的:

var axios = require('axios');
var Datastore = require('nedb');
const fs = require('fs');

db = new Datastore({ filename: './../smb_share/art.db', autoload: true });

function getArt(limit, offset) {
    var config = {
      method: 'get',
      url: 'http://IPADD/api/data/2:1/?limit=' + limit + '&offset=' + offset',
      headers: { 
        'Accept': 'application/simple+json', 
        'Content-Type': 'application/json', 
        'Authorization': 'Basic XYZ'
      }
    };

    axios(config)
      .then(function (response) {
          response.data.erpDataObjects.forEach(element => {
              var doc = { number:element.head.number,
                          desc:element.head.desc
              };
              db.insert(doc, function (err, newDoc) {
                if(err =! null){
                  console.log(err);
                }   
            });
          });  
      })
    .catch(function (error) {
        console.log(error);
    });  
}

getArt(1000,0)
getArt(1000,1000)

这很好用,只要我不从 API 收集更多数据。我需要调用我的函数“getArt(limit, offset)”大约 400 次,因为我从 API 获得了大约 400000 个文档。我尝试使用 intervalTimers 来执行此操作,因此每次触发间隔事件时,每 5 分钟启动一次函数和 ++offset 1000 ...是的,我知道这很奇怪,但这是目前唯一对我有用的方法.但是当API服务器负载很重的时候,一次查询的时间太长,超出了调用的限制,结果一团糟。

我的问题:如何保持清晰并在之前的函数准备就绪时触发函数?我尝试了很多 async/await 东西,但都以错误告终,或者全部都同时被解雇了。我基本上需要的是...

getArt(10000,0)
.then
getArt(10000,10000)
.then
getArt(10000,20000)
.then
...

但是对于 axios 的嵌套函数,我不知道如何用 promise 来处理这个问题。有人可以给我提示吗?

您是否尝试过将 getArt 制作成 async function 并简单地 awaiting

async function getArt(limit, offset){...}

async function Name(){
  await getArt(10000, 1000); // wait to complete before moving on
  await getArt(10000, 2000); // only execute when above is done
}

Name();

通过不分配 await 的结果,您只需告诉您的程序 等待 此函数完成,然后再继续下一个函数。

旁注:

为什么不创建一个增加偏移量并调用 getArt 函数的 for 循环?

async function Name(){
  var limit = 10000;
  for(let offset = 0; offset < limit; offset += limit/10){
    await getArt(limit, offset);
  }
}

Name();

我还没有对此进行测试,但看不出它为什么不起作用。

此外,(遵循良好实践指南)您应该将 await 语句包装在 try-catch 块中以处理如下错误:

try{
  await getArt(limit, offset);
}
catch(err){
  console.error(err);
}