Home  >  Q&A  >  body text

javascript - Node.js http.get的返回结果,怎么传到外面?

function requestOrderAPI(name,floor){

    let re = ''; 
    let url = 'http://此处省略/reservations/plus1?name=' + qs.escape(name) +'&location='+floor;
    
    http.get(url,(res)=>{
        res.setEncoding('utf8');
        let rawData = '';
        res.on('data', (chunk) => rawData += chunk);
        res.on('end', () => {
            re = rawData;
        });
    });

    return name + ':' + re;//异步的原因拿不到re的值
}

我想让requestOrderAPI(name,floor)这个函数返回re。有什么好的办法吗?应该怎么做哪?

伊谢尔伦伊谢尔伦2653 days ago215

reply all(3)I'll reply

  • 高洛峰

    高洛峰2017-04-11 09:23:19

    同步思维转异步的问题。。。
    如果代码写成这样你就能看明白了

    
    function requestOrderAPI(name,floor){
    
        let re = ''; 
        let url = 'http://此处省略/reservations/plus1?name=' + qs.escape(name) +'&location='+floor;
        
        return new Promise(function(resolve, reject) {
            http.get(url,(res)=>{
                res.setEncoding('utf8');
                let rawData = '';
                res.on('data', (chunk) => rawData += chunk);
                res.on('end', () => {
                    resolve(re);
                });
            });
        });
    };
    
    async function test () {
        let re = await requestOrderAPI(name, floor);
        console.log(name + ' ' + re);
    }
    
    test();

    javascript部分中大部分方法都是异步回调的方法,你想要的功能只能通过callback去实现。或者通过一些promise, co, async/await之类的方式去优化一下异步回调,但是本质上他依然是一个异步回调。这个是解决不了的。这个是语言特性。

    reply
    0
  • 黄舟

    黄舟2017-04-11 09:23:19

    function requestOrderAPI(name,floor,callback){
    
        let re = ''; 
        let url = 'http://此处省略/reservations/plus1?name=' + qs.escape(name) +'&location='+floor;
        
        http.get(url,(res)=>{
            res.setEncoding('utf8');
            let rawData = '';
            res.on('data', (chunk) => rawData += chunk);
            res.on('end', () => {
                re = rawData;
                callback&&callback(name + ':' + re);
            });
        });
    }
    
    requestOrderAPI(name,floor,function(res){
        //我是re
    });

    reply
    0
  • PHP中文网

    PHP中文网2017-04-11 09:23:19

    由于request没有promise对象,所以在这里构造一个promise对象。

    const request = require('request');
    const cheerio = require('cheerio');
    function reqst(key) {
      return new Promise((resolve, reject) => {
        request({
          method: "GET",
          url: encodeURI(`http://news.baidu.com/ns?cl=2&rn=20&tn=news&word=${key}`)
        }, (err, res, body) => {
          if (!err && res.statusCode == 200) {
            let ret = [];
            let $ = cheerio.load(body)
            let datas = Array.from($(".result")).splice(0, 5);
            for (var i = datas.length - 1; i >= 0; i--) {
              let data = {
                title: $(datas[i]).find('.c-title').text(),
                author: $(datas[i]).find('.c-author').text(),
                summary: $(datas[i]).find('.c-summary').text()
              }
              ret.unshift(data)
            }
            resolve(ret)
          }
        })
      })
    }
    
    //接收的时候
    reqst(1)
      .then((result) => {
        console.log(result)
      })

    reply
    0
  • Cancelreply