如何按数组内容的顺序执行 async.map 函数
How do I execute async.map function in order of array contents
我有以下代码例程,效果很好。唯一的问题是我需要结果以与 links
数组相同的顺序返回。例如,我需要 google.com link 的结果首先返回,然后是 yahoo 等。代码当前 returns 在 "random" 顺序中。
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);
更新:
谢谢@christophetd。这是我修改后的工作代码:
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);
})
来自 the official async documentation :
the results array will be in the same order as the original collection
这很容易验证:
// 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]
})
正如你在上面的代码中看到的,即使 f
对参数 4
的处理比元素 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'
})
应该会给你预期的结果。
我有以下代码例程,效果很好。唯一的问题是我需要结果以与 links
数组相同的顺序返回。例如,我需要 google.com link 的结果首先返回,然后是 yahoo 等。代码当前 returns 在 "random" 顺序中。
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);
更新: 谢谢@christophetd。这是我修改后的工作代码:
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);
})
来自 the official async documentation :
the results array will be in the same order as the original collection
这很容易验证:
// 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]
})
正如你在上面的代码中看到的,即使 f
对参数 4
的处理比元素 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'
})
应该会给你预期的结果。