Node.js使用请求承诺的嵌套回调无效
我有一个非常简单的nodejs/expressapi,它在Node.js使用请求承诺的嵌套回调无效,node.js,promise,callback,Node.js,Promise,Callback,我有一个非常简单的nodejs/expressapi,它在request.post()中发出request.get()。我只想res.sendrequest.get()的响应主体 我已经尝试过使用一个简单的回调函数来处理request和request-promise。然后()方法无效 const request = require('request') const rp = require('request-promise') app.get("/", (req, res) => {
request.post()中发出request.get()
。我只想res.sendrequest.get()的响应主体
我已经尝试过使用一个简单的回调函数来处理request
和request-promise。然后()
方法无效
const request = require('request')
const rp = require('request-promise')
app.get("/", (req, res) => {
var mapCenter
var address = "user query"
res.send(submitSearch());
function submitSearch() {
if (!mapCenter || !mapCenter.lat) {
googleMapsClient.geocode({
address: address,
}, function(err, res) {
if (!err) {
mapCenter = {lat:res.lat, lng:res.lng };
submitSearch();
}
});
} else {
var parameters = {
uri: domain,
form: {
latitude: mapCenter.lat,
longitude: mapCenter.
},
json: true
}
rp.post(parameters).then(function(res) {
return getResults(res.id)
})
}
}
function getResults(id) {
rp.get(domain+ id).then(function(res) {
return res.Results;
})
}
})
在app.get()
最令人困惑的是,我需要submitSearch()
中googleMapsClient
的奇怪if语句来正确分配mapCenter
,然后再次递归调用submitSearch()
。我知道这是一个异步问题,我看过的无数线程和视频都没有涵盖这种特殊类型的案例。欢迎来到StackOverflow!
正如我在代码中看到的,在设置函数之前调用res.send。
而子搜索正在调用自己?
为了方便起见,我重写了如下代码:
const request=require('request'))
const rp=require('request-promise')
应用程序获取(“/”,(请求,请求)=>{
var地图中心;
var address=“用户查询”;
如果(!mapCenter | |!mapCenter.lat){
googleMapsClient.geocode({
地址:地址:,
},函数(错误,地理代码响应){
如果(!err){
地图中心={lat:res.lat,lng:res.lng};
res.send(geocodeResponse);
}否则{
throw err;//如果不是断言,则抛出错误。
}
});
}否则{
变量参数={
uri:域,
表格:{
纬度:mapCenter.lat,
经度:mapCenter.lng
},
json:true
};
rp.post(参数).then(函数(){
rp.get(域+id)。然后(函数(ReqPromisers){
res.send(geocodeResponse);
})
});
}
})
我建议对.geocode()
使用promise API,这样您就不会试图混合使用普通回调和承诺。这不仅可以简化您的代码,还可以使健壮的错误处理变得更加简单。到目前为止,我在这里看到的所有建议都缺少各种错误处理。我也不明白为什么你需要在这里递归地称呼自己
const rp = require('request-promise');
app.get("/", (req, res) => {
let address = "user query";
// use promise interface for geocode
googleMapsClient.geocode({address}).asPromise().then(response => {
return {lat: response.lat, lng: response.lng };
}).then(mapCenter => {
const parameters = {
uri: domain,
form: {
latitude: mapCenter.lat,
longitude: mapCenter.lng
},
json: true
};
return rp.post(parameters);
}).then(id => {
return rp.get(domain+ id).then(res => res.Results);
}).then(results => {
res.send(results);
}).catch(err => {
// decide what to do here if there's an error
console.log(err);
res.sendStatus(500);
});
});
注意,图中显示:
const googleMapsClient = require('@google/maps').createClient({
key: 'your API key here',
Promise: Promise
});
因此,您可能需要告诉it在初始化这样的东西时使用哪个Promise实现来使用内置Promise。我看到您正在重新发送geoCodeResponse
,它来自googleMapsClient
。我实际上再次调用submitSearch
,因为我需要从else语句中发送post body
。具体来说,我是在使用googleMapsClient
设置mapCenter
后发布到自定义域的。嗯,不要编辑您的问题以包含最终解决方案。这不是stackoverflow的工作方式。问题仍然是问题。答案就在答案所在的地方。我们希望您的问题显示您提出的原始问题,以便这可以成为原始问题的永久参考,然后是该问题的一个或多个答案。请编辑您的问题,使其恢复原样。虽然@Akatsuki levi的回答没有给出正确的结果。他的洞察力引导我自己编辑代码,以获得我所需要的。如果我仍然接受他/她的答案可以吗?您可以添加自己的答案,以显示您最终决定使用的内容(是的,您可以回答自己的问题)。我正在研究一个答案,如果你想等一等,我认为这个答案比这两个都好,因为使用promise界面到googleMaps和chain promise实际上要简单得多,这样你就可以在一个地方处理所有的错误。Levi的答案缺少很多错误处理。我现在发布了我的简化答案。非常感谢@jfriend00。这解决了我的问题。