Javascript 在表达中使用承诺
我想要一个应用程序,其中用户键入一个地址作为查询字符串,然后作为Javascript 在表达中使用承诺,javascript,node.js,express,promise,Javascript,Node.js,Express,Promise,我想要一个应用程序,其中用户键入一个地址作为查询字符串,然后作为json对象接收该位置的天气。在天气检索部分,我使用承诺获取地址的纬度和经度,然后是天气。还有一些选项可以指定语言和单位 函数getWeather(编码、服装、单位、语言){ 让geoKey='XXXXXXXXXXXXXXXXXXXXXXXXXX'; 让geocodeURL=`http://www.mapquestapi.com/geocoding/v1/address?key=${geoKey}&location=${encod
json
对象接收该位置的天气。在天气检索部分,我使用承诺获取地址的纬度和经度,然后是天气。还有一些选项可以指定语言和单位
函数getWeather(编码、服装、单位、语言){
让geoKey='XXXXXXXXXXXXXXXXXXXXXXXXXX';
让geocodeURL=`http://www.mapquestapi.com/geocoding/v1/address?key=${geoKey}&location=${encodedAddress}`;
返回axios.get(geocodeURL)。然后({data})=>{
if(((data.results[0].locations[0].geocodeQualityCode.substring(2)).match(/X/g)| |[]).length>1){
抛出新错误('无法找到该地址')
}
const locationInfo=data.results[0]。位置[0];
const lat=locationInfo.latLng.lat;
const lng=locationInfo.latLng.lng;
console.log('这是:'的天气’,locationInfo.street,locationInfo.adminArea5,
locationInfo.adminArea4,locationInfo.adminArea1,
地址信息(postalCode);
常数weatherKey='xxxxxxxxxxxxxxxxxxxxxxxxxx';
单位=单位?`units=${units}`:'auto';
语言=语言?`lang=${language}`:'lang=en';
常数weatherURL=`https://api.darksky.net/forecast/${weatherKey}/${lat},${lng}?${units}&${language}`;
返回axios.get(weatherURL);
})。然后({data})=>{
const tempInfo=data.current;
常数温度=温度信息温度;
const apparentTemp=tempInfo.apparentTemp;
const summary=tempInfo.summary;
log(`当前为${temp}度,感觉像${apparentTemp}度。\n本地摘要为:${summary}`);
返回当前的数据;
}).catch(错误=>{
如果(error.code==='ENOTFOUND'){
抛出新错误('无法连接到MapRequest服务器');
}否则{
抛出新错误(Error.message);
}
});
};代码>您可以使用或npm包进行承诺
试试这个
const Promise=require('Promise')
函数getWeather(编码、单位、语言){
返回新承诺((解决、拒绝)=>{
让geoKey='XXXXXXXXXXXXXXXXXXXXXXXXXX';
让geocodeURL=`http://www.mapquestapi.com/geocoding/v1/address?key=${geoKey}&location=${encodedAddress}`;
get(geocodeURL).then({data})=>{
if(((data.results[0].locations[0].geocodeQualityCode.substring(2)).match(/X/g)| |[]).length>1){
抛出新错误('无法找到该地址')
}
const locationInfo=data.results[0]。位置[0];
const lat=locationInfo.latLng.lat;
const lng=locationInfo.latLng.lng;
console.log('这是:'的天气’,locationInfo.street,locationInfo.adminArea5,
locationInfo.adminArea4,locationInfo.adminArea1,
地址信息(postalCode);
常数weatherKey='xxxxxxxxxxxxxxxxxxxxxxxxxx';
单位=单位?`units=${units}`:'auto';
语言=语言?`lang=${language}`:'lang=en';
常数weatherURL=`https://api.darksky.net/forecast/${weatherKey}/${lat},${lng}?${units}&${language}`;
get(weatherURL).then(resolve.catch)(拒绝);
})。然后({data})=>{
const tempInfo=data.current;
常数温度=温度信息温度;
const apparentTemp=tempInfo.apparentTemp;
const summary=tempInfo.summary;
log(`当前为${temp}度,感觉像${apparentTemp}度。\n本地摘要为:${summary}`);
解析(data.current);
}).catch(错误=>{
如果(error.code==='ENOTFOUND'){
拒绝(新错误('无法连接到MapRequest服务器');
}否则{
拒绝(错误(Error.message));
}
});
});
};
您在请求数据后立即调用快速回调,如下所示:
forecast.getWeather(req.query.address).then(function(data) {
res.send(data);
});
next();
试试这个:
forecast.getWeather(req.query.address).then(function(data) {
res.send(data);
next();
});
另外,我建议捕获-在Express路由器中捕获错误并将其传递给Express错误处理程序,这样HTTP请求将正确失败,而不仅仅是挂起:
forecast.getWeather(req.query.address).then(function(data) {
res.send(data);
next();
}).catch(next);
最后一行是}的简写形式。catch(err=>next(err))
为getWeather函数添加导出和导入,是否直接导出函数?为什么then({data})
为什么不then((data)=>{…})
这几乎就像预测一样。getWeather
实际上没有使用函数getWeather
-这有可能吗?getWeather
函数怎么会变成预测。getWether
…还有我想这是因为当发送响应时,承诺没有得到解决
不,承诺总是存在的有一个。然后方法,因为这就是work@JaromandaX可能是错误的导出和导入语句。但是forecast.getWeather
是一个函数-否则错误会是其他的:p@AZ_为什么OP需要一个Promise库当问题不是缺少Promise时,它返回的是未定义的
而不是一个承诺
,因此它没有。然后
我甚至没有发现next()。我不确定他是否需要它。他没有实现中间件(不需要直接访问请求或响应