2016-06-09 32 views
0

我正在用Node(Express)从列表中搜索URL来编写小的废料工具。问题是在forEach循环中访问请求回调函数以外的的搜索结果。请帮助 - 为什么结果数组在请求之外是空的?我想将这个结果导出到视图中。此外,请求内定义的任何变量都不是从外部定义的。 这里我的代码:数据不可见外部节点请求功能

var express = require('express'); 
var request = require('request'); 
var bodyParser = require('body-parser'); 
var urlencodedParser = bodyParser.urlencoded({ extended: false }); 
var fs = require("fs"); 
var app  = express(); 


app.get('/scrap/',function(req,res){ 
    res.render('start.ejs'); 

}); 

app.post('/scrap/result', urlencodedParser, function(req,res){ 

     var lista = req.body.lista; 
     var phrase = req.body.phrase;   
     var l = lista.split('\n'); 
     var results = []; // declaring results array  

     l.forEach(function(elem) {    

      request(elem, function(error, response, html) { 

       try { 
       if (html.indexOf(phrase) > 0) { 
       var result = 'Phrase "' + phrase + '" found'; 
       } 
       else { 
        var result = 'Phrase "' + phrase + '" not found'; 
       }     

       } 
       catch(err) { 
       var result = 'Error: '+ err.message; 
       } 
      results.push(result);    

      console.log(results) // here results array is filled with result 

      }); 
      console.log(results); // results array is empty 

     }); 

     console.log(results); // results array is also empty 

      res.render('result.ejs', { 
        result : results[0], 
        phrase : phrase, 
      });  

}); 


app.use(function(req, res, next){ 
    res.redirect('/scrap'); 
}); 

app.listen(3000); 

回答

0

,而不是一个foreach使用地图,并返回承诺的数组,然后提供响应之前,所有的人都qait。

var responsePromises = l.map(geturslResponsePromise) 
q.all(responsePromises).then(function(results){ 
    res.render('result.ejs', { 
     result : results[0], 
     phrase : phrase, 
    });  
}) 

哪里geturslResponsePromise是somethign大意

var geturslResponsePromise = function(elem) { 
    return new Promise(function(resolve, reject){ 

    request(elem, function(error, response, html) { 
     try { 
      if (html.indexOf(phrase) > 0) { 
       resolve('Phrase "' + phrase + '" found'); 
      } 
      else { 
       resolve('Phrase "' + phrase + '" not found'); 
      }     
     } 
     catch(err) { 
      reject('Error: '+ err.message); 
     } 

    }) // request 
    }) // promise 
} 

注:未经测试的代码,大概一吨的错误的,但是这是我将采取与基于ES5语法

注2的方法:我也会推荐更有意义的变量名称。如Request,Responses,Url,Uri在网络空间中相当知名并且质量低劣

+0

呵呵,看起来我仍然对JS中的异步调用有很多了解...谢谢... – Tehawanka

+0

您的解决方案工作得很好btw!只有我将“q”换成了“Promise”:Promise.all(responsePromises)。 – Tehawanka

+0

只是一种记忆 - y promise.all – akaphenom