2015-11-06 52 views
0

我試圖搜索可變數量的數組,當在其中任何一個數組中找到給定值時返回true。使用Async.Parallel Node.js同時搜索多個陣列

我想知道我應該如何處理這個問題,因爲數組可能會非常大。 (我成功使用Array.prototype.forEach,但因爲它是'阻塞'我想使用異步版本)

下面是我目前的嘗試的抽象。

var desired_value = 'example' 
(function(callback) { 

    async.each(arry1, function(somevalue, callback) { 
     if(somevalue === desired_value) return callback(null, true); 
    }); 

    async.each(arry2, function(somevalue, callback) { 
     if(somevalue === desired_value) return callback(null, true); 
    }); 

    async.each(arry3, function(somevalue, callback) { 
     if(somevalue === desired_value) return callback(null, true); 
    }); 

})(function(err, result) { 
    return (!result || err) doThis() : doThat(); 
}); 
+0

我刪除了對async.parallel的調用,因爲我的代碼沒有執行任何I/O – neverknown

回答

0

閱讀有關異步並行注:

注:平行約爲踢關閉I /並行O任務,不是 代碼的並行執行。如果你的任務不使用任何定時器或執行任何I/O,它們將實際上被串行執行。任何 每個任務的同步設置部分將在 之後發生。 JavaScript仍然是單線程的。

https://github.com/caolan/async#paralleltasks-callback

編輯:至於錯誤,parallel需要的函數來執行的陣列。但是,您正在使用結果async.each,該結果不會返回任何內容。

編輯:爲了讓別人如何在非阻塞的方式執行非IO碼一個想法:

function nonblockEach(arr, fn, iterations) { 
    if (iterations == undefined) iterations = 1000; 
    var count = 0; 
    return function(callback) { 
    var index = 0; 
    function exec() { 
     while (count < iterations && index < arr.length) { 
     var element = arr[index]; 
     fn(element, index, arr); 
     index++; 
     count++; 
     } 
     if (index < arr.length) process.nextTick(exec); 
     else callback(); 
    } 
    process.nextTick(exec); 
    } 
} 
var desired_value = 'example' 
var found = false; 
async.parallel([ 
    nonblockEach(arry1, function(some_value) { 
    found = found || (some_value === desired_value); 
    }), 
    nonblockEach(arry2, function(some_value) { 
    found = found || (some_value === desired_value); 
    }), 
    nonblockEach(arry3, function(some_value) { 
    found = found || (some_value === desired_value); 
    }) 
], function(err) { 
    return (found) ? something() : anotherThing(); 
}); 

沒有測試,但它給你的想法。

+0

我明白了。我現在就拉這個。感謝您的快速回復! – neverknown

+0

把東西放在純代碼async – TbWill4321

+0

謝謝!這工作完美。 – neverknown