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
。有什么好的办法吗?应该怎么做哪?
高洛峰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
之类的方式去优化一下异步回调,但是本质上他依然是一个异步回调。这个是解决不了的。这个是语言特性。
黄舟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
});
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)
})