node.js - Nodejs Lodash map 同步请求

标签 node.js async-await lodash sequence synchronous

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

相关文章:

javascript - 等待 lodash 找到完成

node.js - 无法在某个范围内安装 NPM 包,或者无法在范围内安装 NPM 包(或者看起来像这样)

javascript - 如何使用express和ejs包含html文件

node.js - Mongodb图集未连接

jQuery 和异步调用

javascript - 如何使用 Vue.js 在 `keyup` 上使用去抖动

ruby-on-rails - 与 Rails(堆栈)目录相比,MEAN(堆栈)Node.js 应用程序目录是什么样的?

c# - 使用 async/await,continuation 什么时候发生?

c# - 调用异步方法的两种方式。 C#

javascript - 合并数组中项目和 redux 中对象的值