2016-11-18 5 views
0

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; 
     } 
    }; 
} 
+0

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

Antwort

0

ich nicht Superagent bin, aber ich bin so etwas wie dieses erraten könnte funktionieren:

superagent.get(geoSearchUrl) 
    .set('Accept', 'application/json') 
    .then(successData1 => { 
    const results = successData1.body.results; 
    if (!results.length) { 
     throw(`no results found for this search : ${searchTerm}`); 
    } 
    return Promise.resolve(results); 
    }) 
    .then(results => { 
    const lat = results[0].geometry.location.lat; 
    const lng = results[0].geometry.location.lng; 
    const path = `/api/content/stores/byDistance/${lat},${lng}/sort`; 
    return client.get(path); 
    }) 
    .then(successData2 => { 
    return Promise.resolve({ 
     searchTerm: searchTerm, 
     searchLocation: { 
     lat, 
     lng 
     }, 
     data: successData2 
    }); 
    }) 
    .catch(error => { 
    return Promise.reject({ 
     searchTerm: searchTerm, 
     result: error 
    }); 
    }); 

nicht testen, aber ich hoffe es zumindest hilft;)

Verwandte Themen