2015-07-02 7 views
0

Я использовал http, чтобы получить json, но не могу передать его на главную страницу, даже я уже использовал q, может помочь выполнить синхронизацию, но все еще проблемы, кто может помочь? //getturnto.jsПроблема с nodejs sync с q

var conf = require("../conf/setting.json"); 
    var http = require("http"); 

    function TurnToUGC(){ 
     if(!(this instanceof TurnToUGC)){ 
      return new TurnToUGC(); 
     } 
    }; 

    TurnToUGC.prototype.getUGCJson = function(item,callback){    
     var UGCPath = conf.UGCPath; 
     var options = { 
      host:conf.UGCHost, 
      port:conf.UGCPort, 
      path:UGCPath 
     }; 
     http.get(options,function(res){ 
      var buf = ""; 
      res.on("data",function(d){ 
       buf += d; 
      }); 
      res.on("error",function(error){ 
       callback(error); 
      }); 
      res.on("end", function() { 
       var ret; 
       try{ 
        ret = JSON.parse(buf); 
       }catch (err){ 
        return callback(err); 
       } 
       callback(null,ret); 
      }) 
     }).on("error",function(er){ 
      console.log(er); 
     }); 
    }; 
    module.exports = TurnToUGC; 

тогда я хочу показать, (я использовал экспресс создания простого веб-страницы) // это router.index

var q = require("q"); 
    exports.index = function(req, res,next){ 
     var getturnto = require("getturnto")(); 
     q().then(function(){ 
      getturnto.getUGCJson(null,function(err,re){ 
       if(err){ 
        console.log(err); 
        return {"error":err}; 
       }else { 
        console.log(re); 
        return re; 
       } 
      }); 
     }) 
      .then(function(UGCData){ 
       res.render('index', 
        { title: 'Get UGC Content', 
         data:UGCData 
        } 
       ); 
      }) 
      .fail(function(err){ 
       console.log(err); 
       next(err); 
      }); 
    } 

, что JSON может распечатать в консоли , но «UGCData» всегда не определено, и объект json не может перейти на главную страницу.

ответ

0

Просьба ознакомиться с распространением обещаний here. Поскольку ваш getturnto.getUGCJson асинхронен, ваш первый обработчик вывода возвращает undefined. Вот почему вы получаете неопределенное значение в UGCData. Что вам нужно сделать, так это вернуть обещание внутри первого обработчика. Попробуйте так:

var q = require("q"); 
exports.index = function(req, res,next){ 
    var getturnto = require("getturnto")(); 
    q().then(function(){ 
     var deferred = q.defer(); 
     getturnto.getUGCJson(null,function(err,re){ 
      if(err){ 
       console.log(err); 
       deferred.reject(new Error(error)); 
      }else { 
       console.log(re); 
       deferred.resolve(re); 
      } 
     }); 
     return deferred.promise; 
    }) 
     .then(function(UGCData){ 
      res.render('index', 
       { title: 'Get UGC Content', 
        data:UGCData 
       } 
      ); 
     }) 
     .fail(function(err){ 
      console.log(err); 
      next(err); 
     }); 
} 

было бы лучше, если бы вы переписать getUGCJson вернуть обещание.

+0

спасибо! Ты прав. –

+0

как вы предлагаете, я переиздал getUGCJson –

0

окончательный вариант: 1.getturnto.js

.....

TurnToUGC.prototype.getUGCJson = function(){   

     *var deferred = q.defer();* 

     http.get(options,function(res){ 
      .... 
      res.on("error",function(error){ 
       *deferred.reject(new Error(error))*; 
      }); 
      res.on("end", function() { 
       try{ 
        *deferred.resolve(JSON.parse(buf));* 
       }catch (err){ 
        console.log(err); 
       } 
      }) 
     }).on("error",function(er){ 
      console.log(er); 
     }); 
     *return deferred.promise;* 
    }; 

    module.exports = TurnToUGC; 

2.router

 getturnto.getUGCJson(null).then(function(UGCData){ 
      res.render('index', 
       { title: 'Get UGC Content', 
        data:UGCData, 
        comments:UGCData.comments, 
        questions:UGCData.questions 
       } 
      ); 
    }) 
    .fail(function(err){ 
     console.log(err); 
     next(err); 
    }); 
    }