我有一个类似于以下的项目。
数据库客户端.js
const dbClient = require('knex')({
client: 'pg',
connection: {
host: '127.0.0.1',
user: 'user',
password: 'password',
database: 'staging',
port: '5431'
}
})
module.exports = dbClient
Run Code Online (Sandbox Code Playgroud)
库.js
const knex = require('./dbClient.js')
async function doThis(email) {
const last = await knex('users').where({email}).first('last_name').then(res => res.last_name)
// knex.destroy()
return last
}
async function doThat(email) {
const first = await knex('users').where({email}).first('first_name').then(res => res.first_name)
// knex.destroy()
return first
}
module.exports = {
doThat,
doThis
}
Run Code Online (Sandbox Code Playgroud)
测试01.js
const {doThis, doThat} = require('./libs.js');
(async …Run Code Online (Sandbox Code Playgroud) 我有一个我正在使用的API的速率限制器,它允许每秒20个请求.所有请求都是基于承诺的,一旦有响应,承诺将通过API数据解决.
问题:
我设置了一个promiseArray,它包含所有等待响应的58k承诺.所以内存越来越慢,直到我的内存耗尽为止.在我的具体情况下,我不需要将已解析的数据传递给我then(),数据占用了我所有的RAM.
代码:
}).then(() => {
// 2. Crawl for all clanprofiles from these leaderboards
const promiseArray = []
for (let i = 0; i < clanTags.length; i++) {
// Resolved data from getClanProfile() is eating up all my RAM
const p = backgroundScheduler.getClanProfile(clanTags[i], true)
promiseArray.push(p)
}
return Promise.all(promiseArray)
}).then(() => {
Run Code Online (Sandbox Code Playgroud)
那么有没有办法等待promiseArray被解析而不需要解析数据?
我有一个返回承诺的方法,该方法在内部调用一个 API,该 API 每分钟只能有 20 个请求。问题是我有一大堆对象(大约 300 个),我想为每个对象调用 API。
目前我有以下代码:
const bigArray = [.....];
Promise.all(bigArray.map(apiFetch)).then((data) => {
...
});
Run Code Online (Sandbox Code Playgroud)
但它不处理时序约束。我希望我可以使用 _.chunk 和 _.debounce from 之类的东西,lodash但我无法理解它。有人可以帮我吗?
我需要对某些外部 API 执行循环调用,但有一定的延迟,以防止“超出用户速率限制”限制。
Google 地图地理编码 API 对“请求/秒”敏感,允许 10 个请求/秒。我应该对数百个联系人进行地理编码,而这样的延迟是必需的。因此,我需要 10 个异步地理编码函数,每个函数的后延迟为 1 秒。因此,我收集数组中的所有联系人,然后以异步方式循环遍历数组。
一般来说,我需要有 N 个并发线程,每个线程结束时有 D 毫秒的延迟。整个循环迭代用户实体数组。像往常一样,每个线程处理单个实体。
我想有这样的代码:
const N = 10; # threads count
const D = 1000; # delay after each execution
var processUser = function(user, callback){
someBusinessLogicProc(user, function(err) {
setTimeout(function() {
return callback(err);
}, D);
});
}
var async = require('async') ;
var people = new Array(900);
async.batchMethod(people, processUser, N, finalCallback);
Run Code Online (Sandbox Code Playgroud)
在这个伪代码中batchMethod是我要求的方法。