[英]Node.js nested callbacks using request-promise not working
我有一個非常簡單的nodejs / express API,它在request.get()
內部進行request.post()
。 我只是想重新發送request.get()
的響應主體。
我試過使用帶有request
和request-promise... .then()
的簡單回調函數request-promise... .then()
方法無濟於事。
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()
函數中,我希望我的res.send(submitSearch())
在rp.post()
調用中吐出return getResults(res.id)
語句,該語句最終應return res.Results
getResults()
函數。
其中最令人困惑的部分是,我需要在submitSearch()
使用怪異的if語句,以便googleMapsClient
正確分配mapCenter
,然后再次遞歸調用submitSearch()
。 我了解這是一個異步問題,我看過的無數線程和視頻都沒有涉及這種特殊情況。
我建議對.geocode()
使用promise API,然后您就不會嘗試將普通的回調和promise混合使用。 這不僅可以簡化您的代碼,還可以使強大的錯誤處理變得更加簡單。 到目前為止,我在這里看到的所有建議都缺少各種錯誤處理。 我也看不出您為什么需要在此處遞歸調用自己的任何原因。
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
});
因此,可能在初始化此類內容以使用內置Promise時需要告訴它使用哪個Promise實現。
歡迎來到StackOverflow! 而且,正如我在您的代碼上看到的那樣,您在設置函數之前先調用res.send。 然后,commitSearch正在調用自身? 為了方便起見,我將這樣重寫代碼:
const request = require('request')
const rp = require('request-promise')
app.get("/", (req, res) => {
var mapCenter;
var address = "user query";
if (!mapCenter || !mapCenter.lat) {
googleMapsClient.geocode({
address: address,
}, function(err, geocodeResponse) {
if (!err) {
mapCenter = {lat:res.lat, lng:res.lng };
res.send(geocodeResponse);
} else {
throw err; // throw the error if isn't a assert.
}
});
} else {
var parameters = {
uri: domain,
form: {
latitude: mapCenter.lat,
longitude: mapCenter.lng
},
json: true
};
rp.post(parameters).then(function() {
rp.get(domain+ id).then(function(reqPromiseRes) {
res.send(geocodeResponse);
})
});
}
})
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.