2016-06-09 33 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