gpt4 book ai didi

node.js - Nodejs Lodash map 同步请求

转载 作者:太空宇宙 更新时间:2023-11-04 00:13:03 25 4
gpt4 key购买 nike

这是当前情况,我在输入映射中有有效负载 JSON 条目列表(如果您想尝试,它可以是任何内容),我使用 lodash 迭代映射,并以异步方式发布请求,如下所示下面

_.map(enteries, async (entry) => {
let response_1 = await postToAPI('apiurl', entry);
}

问题:- 我尝试过,有 100 个输入,api 无法在 1/10 秒内接受超过 1 个请求(这是一个限制,并且无法更改:( ),因此作为一种解决方法,我想法有两个选择1.我需要在每个请求之间引入 100ms 的暂停2. 按顺序处理它们。

有人可以协助或建议如何实现选项 1 或 2 吗?非常感谢任何帮助

更新了独立代码:-

var _ = require('lodash');

// function for the delay
var delay = function (delayMs) {
return new Promise((resolve) => {
setTimeout(resolve, delayMs);
});
};

// Create some sample entries
var entries = _.map(_.range(0,20), (i) => {
return {id: i, name: 'entry #' + i}
});

// Create sample post request returning a promise
async function postToAPI(apiurl, entry) {
console.log('postToAPI - '+apiurl+ ' request sent = '+ JSON.stringify(entry));
return new Promise((resolve) => {
resolve(entry);
});
};

async function postEntries(entries, allDoneCallback) {
var responses = [];
while(entries.length > 0) {
var entry = entries.shift();
try
{
var response = await postToAPI('apiurl', entry);
console.log('postToAPI - reply '+ JSON.stringify(entry));
responses.push(response);
}
catch (err) {
console.log("An error occurred: " + err);
}
await delay(300);
};

console.log('postEntries (after posting all the enteries) --> '+responses.length);
allDoneCallback(responses);
};

postEntries(entries, (res) => { console.log('All done ', res.length);});

最佳答案

我假设 postToAPI 返回一个 promise 。仅当 API 处理条目的时间超过 100 毫秒时,按顺序发布条目才会有帮助。许多 API 会比这快得多。

我又修改了这个方法!开始了,我认为这确实符合您的要求!!

var delay = function (delayMs) {
return new Promise((resolve,reject) => {
setTimeout(resolve, delayMs);
});
};


async function postEntries(entries, allDoneCallback) {
var responses = [];
while(entries.length > 0) {
var entry = entries.shift();
try
{
var response = await postToAPI('apiurl', entry);
responses.push(response);
}
catch (err) {
console.log("An error occurred: " + err);
}
await delay(100);
};

console.log(responses);
allDoneCallback(responses);
};

// Create some sample entries
var entries = _.map(_.range(0,10), (i) => {
return {id: i, name: 'entry #' + i}
});

postEntries(entries, (res) => { console.log('All done', res);});

您可以修改响应数组以包含发生的任何错误,您会注意到我将 postToAPI 包装在 try/catch block 中,以防任何调用阻塞。

postToAPI 的建议结构:

var postToAPI = function(apiURL, entry) {
console.log(new Date().getTime(), ' - postToAPI');
return postHTTP(apiURL, entry).then ((result) => {
return saveToDB(result);
});
}

一旦我们有了这种格式的 postToAPI,await 就会正常工作。我假设 postHTTP 和 saveToDB 返回 promise 。

关于node.js - Nodejs Lodash map 同步请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48595745/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com