NodeJS 等待 axios+nedb 函数 async/await 运行下一个查询
Posted
技术标签:
【中文标题】NodeJS 等待 axios+nedb 函数 async/await 运行下一个查询【英文标题】:NodeJS wait for an axios+nedb function async/await to run next query 【发布时间】:2021-02-10 23:56:51 【问题描述】:我想在 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服务器负载很重的时候,一个查询需要的时间太长,超出了调用的限制,结果一团糟。
我的问题:当之前的功能准备好时,我如何保持清晰并触发功能?我尝试了很多异步/等待的东西,但都以错误告终,或者同时被解雇。我基本上需要的是...
getArt(10000,0)
.then
getArt(10000,10000)
.then
getArt(10000,20000)
.then
...
但是使用 axios 的嵌套函数,我不知道如何用 promise 来处理这个问题。谁能给我一个提示?
【问题讨论】:
【参考方案1】:您是否尝试过将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);
【讨论】:
谢谢@lbragile,我想我尝试了简单的异步等待函数,但它运行了所有函数调用而不等待前一个。还要感谢旁注,当等待有效时我想做什么。明天我会在生产中再试一次,看看我的实验代码是否有错误。 @Matthias,这里没有加起来,如果你像我提到的那样做了 async/await,那么函数应该在继续下一行之前“等待”响应。你介意分享你的实现吗?你确定你做了 async function getArt(limit, offest)...? SyntaxError: await 仅在异步函数中有效 @Matthias 正如我两次提到的,您需要使用async function getArt(limit, offset)
才能使用await getArt(limit, offset)
。
感谢您的提示,我检查了两次,我的功能是:async function getArt(limit, offset) ... 这让我感到困惑。以上是关于NodeJS 等待 axios+nedb 函数 async/await 运行下一个查询的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 NodeJS 仅将 NeDB 数据库中的某些字段存储到数组中
NEDB & Nodejs:使用用户输入在 home.db 中搜索特定记录 - 无法将参数传递给 index.js