异步映射无法正常工作

时间:2015-08-20 19:09:35

标签: javascript node.js asynchronous async.js

我有类似的东西

var async = require('async');
var request = require('request');//request urls

var urls = ['url1','url2', 'url3' ];

function requestUrl( url, callback){
  console.log(callback.toString());
  request(url, function(err, resp, body){
    callback(null, body)
  })
}

function cb(err, results){ console.log(results); }

然后我通过

来调用它
async.map(urls, requestUrl, cb);

我的'cb'永远不会被召唤。我在第二个参数中使用.toString()方法函数打印出'回调',它看起来像这样。

function (err, v) {
  results[index] = v;
  callback(err);
}

为什么忽略我的回调并把它放在自己的回调中?

2 个答案:

答案 0 :(得分:1)

async.map(arr,iterator,[callback])

arr - 要迭代的数组。

iterator(item,callback) - 迭代器传递一个回调(错误,转换),一旦完成错误(可以为null)和转换项,就必须调用它。

callback(err,results) - 可选当所有迭代器函数完成或发生错误时调用的回调。结果是来自arr。

的转换项的数组

结果是一个数组。

看看这个runnable

var async = require('async');
var request = require('request');

var urls = ['http://www.google.fr', 'http://twitter.fr'];

function requester(url, done) {
  console.log('request: %s', url);
  request(url, function(err, r, body) {
    console.log('request is done');
    console.log('have error on it ?', err !== null);
    if (err) return done(err);
    var res = res;
    var b = body;
    done(null, {
      response: r,
      body: b
    });
  })
}

async.map(urls, requester, function(err, r) {
  console.log('async callback');
  console.log('have error on it ?', err !== null);
  if (err){ 
    console.log('on error', err);
    return;
  }
  console.log('it\'s a success! Now take a look at result :)');
  console.log('results[%s]', r.length);
});

如果您调用自己的端点(例如http://localhost:3000/your/endpoint),请确保此请求不会导致您的节点应用崩溃。

答案 1 :(得分:0)

这是我的错。当您请求数据并且该请求失败时,异步往往会无声地失败并且不会返回您的请求。如果您的请求似乎没有回复,我会打印出任何和所有错误,并检查是否有任何条件未得到满足。

例如我有一个

if

else if

但是两者都没有执行,导致它挂起并造成难以查明的不稳定行为。干净的节目中有3个小时令人沮丧的教训。