相关疑难解决方法(0)

使用ES6的Promise.all()时限制并发性的最佳方法是什么?

我有一些代码在一个列表中进行迭代,该列表从数据库中查询并为该列表中的每个元素发出HTTP请求.该列表有时可能是一个相当大的数字(成千上万),我想确保我没有遇到数千个并发HTTP请求的Web服务器.

此代码的缩写版本目前看起来像这样......

function getCounts() {
  return users.map(user => {
    return new Promise(resolve => {
      remoteServer.getCount(user) // makes an HTTP request
      .then(() => {
        /* snip */
        resolve();
      });
    });
  });
}

Promise.all(getCounts()).then(() => { /* snip */});
Run Code Online (Sandbox Code Playgroud)

此代码在Node 4.3.2上运行.重申Promise.all一下,可以进行管理,以便在任何给定时间只有一定数量的Promise正在进行中?

javascript node.js es6-promise

67
推荐指数
7
解决办法
3万
查看次数

我如何执行大量的承诺?

我计划在 firebase 上运行大量查询,这些查询可能会增长到数十万甚至数百万的数量级。我一直在使用Promise.all()来解决我的大部分查询,但随着请求的增长Promise.all()似乎只是停止以随机数运行。我研究过使用,Promise.map()但我不确定并发是否能解决问题。感谢您的帮助。

下面是一个简化的示例,您可以看到它似乎只是超时而不会引发任何错误:

var promises = [];
var i = 0;
for(var x = 0; x<1000000; x++){
 const promise = new Promise((resolve, reject) => {
  setTimeout(() => {
    i += 1;
    resolve(i);
  }, 10);
});
  promises.push(promise);
}


Promise.all(promises).then((value) => {
  console.log(value)
}).catch((error) => {
  console.log("Error making js node work:" + error);
})
Run Code Online (Sandbox Code Playgroud)

javascript node.js promise es6-promise

4
推荐指数
1
解决办法
4025
查看次数

带有 Promise 的 async.mapLimit

我正在尝试使用异步模块 (v3),尤其是 async.mapLimit 方法来提交有限数量的并行异步请求。这适用于以下(简化的)示例代码中的回调:

async = require('async');
async.mapLimit(['1','2','3','4','5'], 3, function(num, callback){
setTimeout(function(){
    num = num * 2,
    console.log(num);
    callback(null, num);
}, 
4000);  
},function(err, results){
    console.log(results);
});
Run Code Online (Sandbox Code Playgroud)

结果,我得到了单个值,最后得到了包含“结果”中所有值的数组:

[2,4,6,8,10]
Run Code Online (Sandbox Code Playgroud)

现在我正在努力使用这种方法的基于 Promise 的版本。文档说,如果我不提供回调,它会返回一个 Promise。如何将此基于回调的代码更改为使用 Promises?

我试过例如这个,但它只显示第一组请求(这是在评论中的第一个建议之后更新的):

let numPromise = async.mapLimit(['1','2','3','4','5'], 3, function(num, callback){
    setTimeout(function(){
        num = num * 2,
        console.log(num);
        callback(null, num);
    }, 
    4000); 
});
Promise.all([numPromise]) //always calls .then immediately, without result
.then((result) => console.log("success:" + result))
.catch(() => console.log("no success"));
Run Code Online (Sandbox Code Playgroud)

我确实正确地取回了所有单个值,但是 '.then' 会立即执行并给我一个空的 'result' 变量的 'Success'。

注意:我当然看过这个线程ES6 Promise …

node.js promise async.js

2
推荐指数
1
解决办法
1934
查看次数

标签 统计

node.js ×3

es6-promise ×2

javascript ×2

promise ×2

async.js ×1