Ich habe eine Redux-Aktion, die 2 nachfolgende Ajax-Aufrufe machen muss.Redux-Kette Mehrere Ajax Versprechen in einer Aktion
Die ersten Anrufe Googlemap api: https://maps.googleapis.com/maps/api/geocode/json?address=${searchTerm}&key=${gmapsKey}
Der zweite einen lokalen Dienst fordert diesen Ergebnissen basierend /api/content/stores/byDistance/${lat},${lng}/sort
ich superagent bin mit der Ajax-Aufrufe zu tun. Offensichtlich habe ich Schwierigkeiten, die Versprechen zu verfolgen und Misserfolge mit einzubeziehen.
Bin ich ein Kernkonzept von Promises falsch? Gibt es eine einfachere Möglichkeit, das Folgende zu schreiben?
export function loadBySearch(searchTerm) {
const geoSearchUrl = `https://maps.googleapis.com/maps/api/geocode/json?address=${searchTerm}&key=${gmapsKey}`;
return {
types: [LOAD, LOAD_BY_LAT_LONG, LOAD_FAIL],
//Do I need to make this promise here?
promise: (client) => {
const promise = new Promise((resolve, reject) => {
console.info('making google geocode request', geoSearchUrl);
superagent.get(geoSearchUrl)
.set('Accept', 'application/json')
.then((successData1) =>{
const results = successData1.body.results;
if (!results.length) {
reject(`no results found for this search : ${searchTerm}`);
return;
}
const lat = results[0].geometry.location.lat;
const lng = results[0].geometry.location.lng;
const path = `/api/content/stores/byDistance/${lat},${lng}/sort`;
client.get(path).then(
(successData2) => {
resolve({
searchTerm: searchTerm,
searchLocation: {
lat,
lng
},
data: successData2
});
},
(errorData2) => {
reject({
searchTerm: searchTerm,
result: errorData2
});
},
);
},
(errorData1) => {
reject({
searchTerm: searchTerm,
result: errorData1
});
}
);
});
return promise;
}
};
}
Könnte ich empfehlen, diese Logik funktional zu brechen, so ist es viel sauberer und klarer (meiner Meinung nach). Und um deine Frage zu beantworten, ja, du brauchst dort eine Verheißung, und du willst nur die äußere Verheißung lösen, wenn deine ganze Logik erledigt ist. – ajmajmajma