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);
}
我想在 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);
}