【发布时间】:2016-07-28 07:18:56
【问题描述】:
我有以某种方式接收 100000 个数据集的代码。 然后有一个存储必须以一种只有在最后一次添加完成后才能开始下一个才能开始的方式访问。
以一种看起来像这样的同步方式..所以 add 方法会阻塞。
var data = [...]; //100000 datasets
var syncstorage = require( 'syncstorage' ); // syncronous storage.
for( var i = 0 ; i < data.length() ; i++ ) {
syncstorage.add( data[i] ); // will only return once stored
}
异步存储不会阻塞,但它会在回调完成时告诉您...
/////// async storage
asyncstorage.add( data[i] , function(err) { /* can only execute another add once i get this response */ } )
我现在才想到这个:
var i = 0;
function execute() {
if( i >= data.length()){
return;
}
asyncstorage.add( data[i] , function(err) { i++; execute(); } )
}
但是它会导致一个极端的调用堆栈
也许我需要一个事件发射器并在该回调中发出它? 有点像资源包装器? 这是如何解决的? ...遗憾的是,我没有发现与此特定问题有关的堆栈溢出结果;
排除解决方案
- async.each
- http://caolan.github.io/async/docs.html#.each
- “此函数将 iteratee 并行应用于每个项目”
- 异步系列
- http://caolan.github.io/async/docs.html#.series
-
- 它需要一个不是数据的函数数组
-
- 这将需要从回调中调用回调才能不准并行运行
- 所以它可以使用,但只能用于不成比例的内存需求(函数)
- 也不确定异步如何在内部处理这个问题(调用堆栈)
测试示例
var store = {add:function(d,cb){cb(null)}};
var d=[]; for(var i = 0 ; i < 100000; i ++) { d.push(i)}; d;
var async = require('async');
async.eachSeries(d,store.add);
不起作用!
这是因为 async 假定 iteratee 函数中将存在一个事件发射器。
因此,像上面这样的简单测试类在 Maximum call stack size exceeded
【问题讨论】:
标签: node.js asynchronous software-design eventemitter