2016-05-24 8 views
1

私は以下のコードルーチンが優れています。唯一の問題は、links配列の同じ順序で戻ってくる必要があるということです。たとえば、google.comのリンクの結果が最初に返ってきた後、yahooなどが必要です。コードは現在、「ランダム」な順序で返されています。配列の内容の順にasync.map関数を実行するにはどうすればいいですか?

var Nightmare = require('nightmare'); 
var async = require('async'); 
var links = [ 
    "http://www.google.com", 
    "http://www.yahoo.com", 
    "http://www.bing.com", 
    "http://www.aol.com", 
    "http://duckduckgo.com", 
    "http://www.ask.com" 
    ]; 

var scrape = function(url, callback) { 
    var nightmare = new Nightmare(); 
    nightmare.goto(url); 
    nightmare.wait('body'); 
    nightmare.evaluate(function() { 
    return document.querySelector('body').innerText; 
    }) 
    .then(function (result) { 
    console.log(url, result); 
    }) 
    nightmare.end(function() { 
    callback(); 
    }); 
} 

async.map(links, scrape); 

UPDATE: おかげで@christophetd。ここに私の改訂作業のコードは次のとおりです。the official async documentationから

var Nightmare = require('nightmare'); 
var async = require('async'); 
var links = [ 
    "http://www.google.com", 
    "http://www.yahoo.com", 
    "http://www.bing.com", 
    "http://www.aol.com", 
    "http://duckduckgo.com", 
    "http://www.ask.com" 
    ]; 

var scrape = function(url, callback) { 
    var nightmare = new Nightmare(); 
    nightmare.goto(url); 
    nightmare.wait('body'); 
    nightmare.evaluate(function() { 
    return document.querySelector('body').innerText; 
    }) 
    .then(function (result) { 
    callback(null, url+result); 
    }); 
    nightmare.end(); 
} 

async.map(links, scrape, function (err, results) { 
    if (err) return console.log(err); 
    console.log(results); 
}) 
+0

あなたが説明するものは非同期ではありません...あなたはそれらをすべて持っていれば、それらを並べ替えることができますか? – dandavis

答えて

3

結果の配列が確認することが非常に簡単です、元のコレクション

と同じ順序になります。

// This function waits for 'number' seconds, then calls cb(null, number) 
var f = function (number, cb) { 
    setTimeout(function() { 
     cb(null, number) 
    }, number * 1000) 
} 

async.map([4, 3, 2, 1], f, function (err, results) { 
    console.log(results); // [4, 3, 2, 1] 
}) 

コードに見られるようにeの場合、引数4の処理がfであっても、要素3よりも時間がかかりますが、依然として結果の先頭になります。あなたのコード、書き込みの場合には


async.map(links, scrape, function (err, results) { 
    if (err) { 
     // handle error, don't forget to return 
    } 
    // results will be in the same order as 'links' 
}) 

はあなたに期待される結果を与える必要があります。

+0

ありがとう、これは完璧でした。私はあなたがドキュメントで参照した答えを見ていましたが、何らかの理由であなたの答えが見えるまでそれは意味をなさないものでした。 – Matt

関連する問題