2016-03-06 53 views
0

我從字面上剛開始使用nodeJS,並且在過去的8個小時裏一直在干擾它。我之前完成了J2EE和.NET,並且也想進入NodeJS。初學Node.JS,沒有按預期返回

我試圖從Data.js文件獲取響應時遇到問題。我可以成功地將數據串聯起來,但由於某種原因,我無法將其返回。它在index.js路由器中結束爲null或空字符串(它的默認值)。我已經在下面的Data.js代碼中解釋了註釋。

謝謝你提前告訴我,我怎樣才能提高我的代碼:) 我仍然有很多的概念,瞭解

index.js

var express = require('express'); 
var router = express.Router(); 

/* GET home page. */ 
router.get('/', function(req, res, next) { 
var Data = require('../public/javascripts/Data'); 
var responseString = Data.test; 

    res.render('index', { d: responseString }); 
    console.log(responseString) 
}); 

module.exports = router; 

Data.js

var request = require('request'), 
cheerio = require('cheerio'), 
responseTitles = [], 
responseUrls = [], 
responseJSONArray = [], 
responseTotalNumber = 0, 
responseString = ""; 


function getData(){ 
request('URL',function(err,response,body){ 
    console.log("requesting..") 
    if(!err && response.statusCode == 200){ 
     console.log("success..") 
     var $ = cheerio.load(body); 
     var data = []; 
     data = $('span.titletext'); 
     data.each(function(i){ 
      responseTitles.push(data[i].children[0].data); 
      responseUrls.push(data[i].parent.attribs.url); 
      responseTotalNumber = i; 

      responseJSONArray.push([{index: i, Title: data[i].children[0].data, url: data[i].parent.attribs.url}]) 
     }); 
     responseString = JSON.stringify(responseJSONArray); 
     //At this point, responseString has all the data but 
     //if I put the return here, it doesn't return anything 
    } 
    }); 
//At this point responseString returns "". And so it returns an empty string 
return responseString; 
} 


module.exports= { 
    test: getData() 
}; 
+0

這是關於異步Javascript編程的最常見的重複問題之一。 – jfriend00

回答

2

您的getData函數異步調用request,然後立即返回responseString的值,該值始終爲''

想想代碼:

module.exports= { 
    test: getData() 
}; 

這到底是怎麼回事?您

  1. 立即執行你的getData功能,其中:
    • 執行request,並
    • 回報''
  2. 與單場包含此結果test導出你的模塊('') 。

所以你基本上是這樣做的:

module.exports = { 
    test: '' 
}; 

我以爲是不是你的意圖。你可能想要的東西接近這個:

module.exports = { 
    test: getData 
}; 

不含括號意味着你正在返回的函數本身而不是調用函數的結果。

由於您正在異步工作,您可能希望包含回調參數或返回來自您的getData函數的承諾,以便訪問請求的結果。也許是這樣的:

Data.js:

function getData (cb) { 
    request('URL', function (err, response, body) { 

     ... 

     responseString = JSON.stringify(responseJSONArray); 
     cb(responseString); 
    }); 
} 

module.exports = { 
    test: getData 
}; 

,然後用它是這樣的:

指數。js

var data = require('../public/javascripts/Data'); 
router.get('/', function (req, res, next) { 
    data.test(function (responseString) { 
     res.render('index', { d: responseString }); 
    }); 
}); 
+0

那是有道理的,但我該如何解決它?我很抱歉,甚至以爲我曾在.NET中使用過異步調用,但在NodeJS中我仍然沒有得到這個概念。 – ExPlOiD

+0

是否有可能只返回responseString而不是實際上整個函數? responseString變量確實具有所有數據,在我按照註釋中所述對字符串化的responseJSONArray變量進行了處理後。但似乎是因爲該方法是異步的,它沒有等待響應 – ExPlOiD

+0

@ExPlOiD看看我爲你拋出的例子。無法返回'resultString'本身 - 在對'request'的調用完成後,您必須異步訪問它。 –