2016-01-13 27 views
0

我有一個叫weather.js文件看起來像這樣瞭解Express數據流和回調

var request = require('request'); 
var exports = module.exports = {}; 

exports.getWeather = function (cb){ 
    request('https://api.forecast.io/forecast/apiKey/43.0796,-89.3758', function (error, response, body) { 
     if (!error && response.statusCode == 200) { 
     console.log(error); 
     } 
     else if(!error && response.statusCode == 200) { 
     console.log("forcast io response received"); 
     return body; 
     } 
    }); 
}; 

和快速路徑文件:

var express = require('express'); 
var router = express.Router(); 
var weather = require("../models/weather.js") 


/* GET home page. */ 
router.get('/', function(req, res, next) { 
    res.render('index', { weather: weather.getWeather() }); 
}); 

module.exports = router; 

我知道我的GetWeather()函數作品因爲如果我console.log(正文)的JSON字符串打印,但它不會呈現在我的瀏覽器。我不是真正理解的是異步模式如何工作。我在想,JSON不會被打印,因爲網頁在函數被觸發/完成之前被渲染。一旦數據返回,我怎樣才能使用回調來顯示api調用的數據?

回答

1

在此代碼不能執行return body

else if(!error && response.statusCode == 200) { 
     console.log("forcast io response received"); 
     return body; 
     } 

如果使用Promise,你可以寫這樣的代碼:

'use strict'; 

var exports = module.exports = {}; 

exports.getWeather = function() { 
    return Promise(function(resolve, reject) { 
     request('https://api.forecast.io/forecast/apiKey/43.0796,-89.3758', function (error, res, body) { 
      if (!error && response.statusCode == 200) { 
       reject(error); 
      } else { 
       console.log("forcast io response received"); 
       resolve(body); 
      } 
     } 
    }); 
} 



var express = require('express'); 
var router = express.Router(); 
var weather = require("../models/weather.js") 


/* GET home page. */ 
router.get('/', function(req, res) { 
    weather 
     .getWeather() 
     .then(function(body){ 
      res.render('index', { weather: body }); 
     }) 
     .catch(function(error) { 
      res.end(error); 
     }); 
}); 

module.exports = router; 
+0

我只是在學習節點,所以很抱歉,如果這是一個愚蠢的問題,那麼爲什麼在這裏使用承諾而不是回調?我會標記這個權利,但是我在weather.js中得到了「undefined不是一個承諾」。我一直無法弄清楚爲什麼只有 – badger0053

+0

我明白了。我需要改變它以「回報新的承諾」 – badger0053

-1
var request = require('request'); 
var exports = module.exports = {}; 

exports.getWeather = function (cb){ 
    request('https://api.forecast.io/forecast/apiKey/43.0796,-89.3758', function (error, response, body) { 
     if (error) { 
       console.log("Error");return; 
      } 
      else if(!error && response.statusCode == 200) { 
      cb(body); 
      } 
    }); 
}; 

var express = require('express'); 
var router = express.Router(); 
var weather = require("../models/weather.js") 
/* GET home page. */ 
router.get('/', function(req, res) { 
    weather.getWeather(function(body){ 
      res.render('index', { weather: body }); 
     }) 
}); 

module.exports = router; 
+0

如何訪問'在你的第二個res'方法? – BlackMamba

+0

是否需要使用promise,因爲我可以通過上面的代碼實現結果? – rroxysam