相关疑难解决方法(0)

限制Node.js中的异步调用

我有一个Node.js应用程序,它在本地获取文件列表并将它们上传到服务器.此列表可能包含数千个文件.

for (var i = 0; i < files.length; i++) {
   upload_file(files[i]);
}
Run Code Online (Sandbox Code Playgroud)

如果我用数千个文件执行此操作,upload_file将同时被调用数千次,并且很可能死亡(或者至少是挣扎).在同步世界中,我们创建一个线程池并将其限制为一定数量的线程.是否有一种简单的方法可以限制一次执行多少次异步调用?

asynchronous node.js

45
推荐指数
3
解决办法
2万
查看次数

定时承诺队列/油门

我有一个请求 - 承诺函数,它向API发出请求.我受这个API的速率限制,我不断收到错误消息:

Exceeded 2 calls per second for api client. Reduce request rates to resume uninterrupted service.
Run Code Online (Sandbox Code Playgroud)

我正在Promise.each并行运行几个循环导致问题,如果我只运行一个实例Promise.each运行正常.在这些Promise.each调用中,它们通过请求 - 承诺调用导致相同的功能a .我想用另一个queue函数包装这个函数,并将间隔设置为500毫秒,这样a request就不会在一个或另一个之后进行,而是在队列上设置为那个时间.事情是,即使需要相当长的时间来获得回复,我仍然需要这些承诺来获取其内容.

有什么能帮我的吗?我可以包装一个函数的东西,它将以一个设定的间隔响应,而不是并行响应或一个接一个的消防功能?

更新:也许它确实需要特定的承诺,我试图使用下划线的油门功能

var debug = require("debug")("throttle")
var _ = require("underscore")
var request = require("request-promise")

function requestSite(){
  debug("request started")
  function throttleRequest(){
    return request({
      "url": "https://www.google.com"
    }).then(function(response){
      debug("request finished")
    })
  }
  return _.throttle(throttleRequest, 100)
}

requestSite()
requestSite()
requestSite()
Run Code Online (Sandbox Code Playgroud)

我得到的就是这个:

$ DEBUG=* node throttle.js …
Run Code Online (Sandbox Code Playgroud)

javascript queue rate-limiting promise bluebird

5
推荐指数
1
解决办法
2917
查看次数

请求npm模块-解决ESOCKETTIMEDOUT

我正在使用请求npm模块,并以大约每秒100个请求的周期发出上游请求。超时已设置为10秒。问题是我一直在1000个请求中始终获得1个的ESOCKETTIMEDOUT。

我非常确定上游服务器不会超时。这可能是什么原因以及如何避免它。

request node.js npm

5
推荐指数
0
解决办法
3185
查看次数

Node.js - 使用每秒 5 个请求的 API 限制

我有一个“脚本”,可以向特定 API 发出数千个请求。这个 API 每秒只允许 5 个请求(可能它的测量方式与我不同)。为了提出我正在使用的request-promise框架的请求,我已经request-promise用这个取代了正常的功能:

const request_promise  = require('request-promise')

function waitRetryPromise() {
  var count = 0 // keeps count of requests
  function rp(options) {
    const timedCall = (resolve) => setTimeout( ()=>resolve(rp(options)),1000) // recursive call
    count += 1
    if (count % 3 == 0) { // recalls after a second on every third request
      return new Promise(timedCall)
    } else {
      return request_promise(options)
    }
  }
  return rp
}

const rp = waitRetryPromise()
Run Code Online (Sandbox Code Playgroud)

一旦连续发出大约 300 个请求(给予或接受),这些请求就会开始相互干扰。有没有人有更好的解决方案?我认为对同一个函数的递归调用会有所帮助,它确实做到了,但并没有解决问题。也许有一种模式可以将请求排队,并且一次做几个?也许是图书馆?

谢谢!

javascript node.js promise request-promise

5
推荐指数
1
解决办法
4939
查看次数