Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在表达中使用承诺_Javascript_Node.js_Express_Promise - Fatal编程技术网

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()。我不确定他是否需要它。他没有实现中间件(不需要直接访问请求或响应