2016-07-17 6 views
0

So habe ich diese Klasse namens Ereignisse und ich versuche, eine asynchrone Funktion von meinem Server aufzurufen. Ich versuche zu verstehen, wo ich falsch gelaufen bin und wie ich ein Versprechen in einem anderen asynchronen Anruf lösen kann. Irgendwelche Hinweise oder Tipps würden sehr geschätzt werden.Versuchen, eine Versprechenskette aus ES6-Klassenfunktionen zu lösen

Dies ist die Event-Funktion Ich rufe:

Event.prototype.getCost = function(name_of_place){ 
return new Promise(function(){ 
     var placeID; 
     var GooglePlaces = require("node-googleplaces"); 
     const places = new GooglePlaces(API_KEY); 
     const params = { 
      location: '40.689247,-123.102192', 
      radius: 1000 
     }; 
     var query = 
     { 
      query: name_of_place 
     }; 
     // ASYNC call 
     places.textSearch(query).then((res) => { 
      console.log("FIRST ASYNC CALL"); 
      console.log(res.body.results[0].place_id); 
      placeID = res.body.results[0].place_id; 
      var request_place_details={ 
       placeid : placeID 
      }; 
      console.log(request_place_details); 

      return request_place_details; 

     }).then((request_place_details) => { 
      console.log("SECOND ASYNC CALL"); 
      places.details(request_place_details).then((res) => { 
       console.log(res.body.result.price_level + " S"); 
       var cost = res.body.result.price_level; 
       //trying to resolve getCost promise 
       //resolve(this.cost); 
       return cost; 
      }).then((cost) => { 
       console.log("ATTEMPT TO RESOLVE ORIGINAL"); 
       this.cost = cost; 
       console.log(cost + " F"); 

       //WANT TO RETURN THIS VALUE IN THE END 
       resolve(this.cost); 
      }); 
     }); 
    })}; 

Dies ist, wo ich es von bin Aufruf:

//Server is currently serving on port 8420 
app.listen(8420,function startServer(){ 
console.log("Listening on :: " + 8420); 
var Event1 = new events(7,10,'New York'); 
// console.log(Event1.getCost('Sushi')); 
Event1.getCost('Sushi').then(res => { 
     console.log(res); 
}) 
}); 
+0

Dies ist ein [anti-pattern] (https://github.com/petkaantonov/bluebird/wiki/Promise-anti-patterns) zu wickeln ein anderes Versprechen in einem neuen Versprechen und wird nicht benötigt. Geben Sie einfach places.textSearch (query) .then (...) 'zurück und entfernen Sie das äußere Versprechen vollständig. – jfriend00

+1

Der ganze Sinn von Versprechen besteht darin, asynchrone Dinge zu verketten - gib ein Versprechen ab und du kannst es dann aus deiner Hauptversprechenskette machen, anstatt Versprechungen zu verschachteln! – towerofnix

Antwort

4

Ihre gesamte Struktur ist viel zu kompliziert. wenn die Kommentare Strippen, können Sie den Code dazu reduzieren:

Event.prototype.getCost = function(name_of_place){ 
    var GooglePlaces = require("node-googleplaces"); 
    const places = new GooglePlaces(API_KEY); 
    //const params = { 
    // location: '40.689247,-123.102192', 
    // radius: 1000 
    //}; 

    return places.textSearch({ query: name_of_place }) 
     .then(res => res.body.results[0].place_id) 
     .then(placeID => places.details({ placeid : placeID })) 
     .then(res => res.body.result.price_level) 
} 
0

Sie sind nicht ein Versprechen richtig, return new Promise(function(resolve, reject){}

erklärt

Und dann können Sie das so verwenden

places.details(request_place_details).then((res) => { 
      console.log(res.body.result.price_level + " S"); 
      var cost = res.body.result.price_level; 


      // Just resolve it here. 
      resolve(cost);     
     }); 


// And here, res == cost. 
Event1.getCost('Thai Moon').then(res=> { 
    console.log(res); 
}) 

Auch als Referenz, überprüfen Sie die Promise docs.