这是当前情况,我在输入映射中有有效负载 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/