节点async.map如何在所有任务完成后调用函数本身

时间:2017-09-30 16:24:09

标签: node.js asynchronous

我有以下代码:

function get_status(){
    try {
  /* GET - status */
async.map(['http://url1.com/', 'http://url2.com/', 'http://url3.com/'], function(value, callback) {
     /* GET - request status */
     request.post({
          url: value,
          form: { 'mycustomdata': ""+mycustomdata+"" },
          method: 'POST'}, function(err, res, body) {
               /* CHECK - response */
               if (!err && typeof body !== 'undefined' && res.statusCode == 200) {

                   console.log('get status success...')         
                   callback();
               } else {
                   callback('failed to get status');
               }
          })
    }, function(err, results) {
        if (err) { 
            console.log(err); return false;
        } else {
            console.log('finished...') }
    })
}

我需要在async.map处理中的所有三个网址都完成后(某些网址会回复一些网址)来调用输出完成的内容...'并从此输出再次调用此函数...以便每次处理所有URL时该函数都会运行。

所以简而言之..我需要当async.map处理所有网址输出到控制台时完成......'并再次运行相同的功能。

但我只能从控制台获得...

 get status success... 
 failed to get status..
 get status sucess..

我永远不会被称为

 'finished'...

这样我就可以对它进行调整...请你点亮我需要写的内容吗?

2 个答案:

答案 0 :(得分:1)

你只会将// TodoItem class TodoItem extends Component { handleRemove = () => this.props.onRemove(this.props.id) render() { return ( <div className='row myList'> <p className='col-xs-10'> {this.props.text}-{this.props.id} </p> <button className='btn btn-danger pull-right col-xs-2' onClick={this.handleRemove}> Delete </button> </div> ) } } // App render render() { return ( <div className='todo-wrapper'> <Header/> <InputTodo todoText='Type Here...' addTodo={this.addHere}/> <div> {this.state.todos.map(({ id, text }, key) => <TodoItem key={key} id={id} text={text} onRemove={this.removeHere} /> )} </div> </div> ); } param传递给最后的回调。我相信,从我上次使用async.js开始,你需要传入err作为第一个参数继续下一个函数,这里是最后一个函数。否则将跳过最终函数作为错误。

null

如果你想让它再次自我调用,那只是简单的递归。将async.map包装在函数中,当 callback(null, results); 运行时,再次调用该函数。

答案 1 :(得分:0)

好的,我做了完整的示例,以便您可以看到问题所在,您可以尝试更改代码:

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

var myUrls = [ 'http://56.123.65.86:8080/api/server_status/',
  'http://88.96.42.122:8080/api/server_status/',
  'http://12.23.32.25:8080/api/server_status/',
  'http://251.214.44.58:8080/api/server_status/',
  'http://122.23.32.54:8080/api/server_status/' ]

async.map(myUrls, function(url, callback) {
    console.log('getting url...'+url)
  request(url, function(error, response, html) {
    // Some processing is happening here before the callback is invoked
    if (typeof response !== undefined) {
        console.log('response ok...'+url)
        return callback(null, html)
    } else {
        console.log('response failed...'+url)
        return callback(error, html);
    }
  });
}, function(err, results) {
   if (results) {
       console.log('all finished...')
   }
});

我得到了这个:

getting url...http://56.123.65.86:8080/api/server_status/
getting url...http://88.96.42.122:8080/api/server_status/
getting url...http://12.23.32.25:8080/api/server_status/
getting url...http://251.214.44.58:8080/api/server_status/
getting url...http://122.23.32.54:8080/api/server_status/

需要得到这个:

getting url...http://56.123.65.86:8080/api/server_status/
getting url...http://88.96.42.122:8080/api/server_status/
getting url...http://12.23.32.25:8080/api/server_status/
getting url...http://251.214.44.58:8080/api/server_status/
getting url...http://122.23.32.54:8080/api/server_status/
all finished...

我无法完成全部...所以它一直保持着获取网址并保持永久......所以我无法理解为什么所有项目都已完成...而不是在处理完所有项目后的触发器......