只在调用nodejs中完成一次调用异步函数

时间:2016-07-28 07:18:57

标签: node.js asynchronous software-design eventemitter

我有代码以某种方式接收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(); } )     
}
然而,它会导致极端的callstack

也许我需要一个事件发射器并在该回调中发出它? 有点资源包装? 这是如何解决的? ...我遗憾地没有找到关于这个特定问题的堆栈溢出的结果;

排除了解决方案

测试示例

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

中运行

1 个答案:

答案 0 :(得分:1)

使用承诺或Async

INSERT INTO t_import (a, b, c, d, e)
    SELECT (
      (CAST a AS integer) AS a,
      (CAST b AS character varying(14)) AS b,
      (CAST c AS integer) AS c,
      (CAST d AS character varying) AS d,
      (CAST e AS character varying) AS e
    FROM t_csv;

删除df['Survived'].value_counts() df['Sex'].value_counts() 的决定是致电var async = require('async'); // Assuming that asyncstorage.add = function(chunk, callback) { ... } async.eachSeries(data, asyncstorage.add, function(err) { if (err) console.log(err); ... }); 。它为node.js提供了清除堆栈的机会(read more)&#34;。

改进代码
异步

Maximum call stack size exceeded

活动Emmiter

nextTick