【问题标题】:How do I execute async.map function in order of array contents如何按数组内容的顺序执行 async.map 函数
【发布时间】:2016-05-25 06:00:00
【问题描述】:

我有以下代码例程,效果很好。唯一的问题是我需要以与links 数组相同的顺序返回结果。例如,我需要先返回 google.com 链接的结果,然后返回 yahoo 等。代码当前以“随机”顺序返回。

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);
})

【问题讨论】:

  • 你所描述的不是异步的......一旦你拥有它们,你能重新订购它们吗?

标签: javascript node.js asynchronous async.js nightmare


【解决方案1】:

来自the official async documentation

结果数组将与原始集合的顺序相同

这很容易验证:

// 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'
})

应该会给你预期的结果。

【讨论】:

  • 谢谢,这太完美了。我已经看到您在文档中引用的答案,但由于某种原因,直到我看到您的答案才有意义。
猜你喜欢
  • 2015-11-09
  • 2020-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-29
  • 2017-10-02
  • 1970-01-01
  • 2013-11-19
相关资源
最近更新 更多