2016-06-18 10 views
1

Ich benutze Angular2 für meine Anwendung und ich muss Amazon S3 Javascript sdk für den Browser verbrauchen. Ich habe die folgende Funktion:Angular2: Returning Promise

getBuckets() { 
     var s3 = this.getS3(); 
     var params = {}; 
     s3.listBuckets(params, function(err, response) { 
      if (err) { 
       // What to return? 
      } 
      else { 
       // What to return? 
      } 
     }) 
} 

s3.listBuckets ist der JavaScript-API von Amazon für S3. Es erwartet eine Rückruffunktion. Aber der Aufrufer von GetBuckets erwartet ein Versprechen. Wie soll ich die oben getBuckets(), so ändern, dass der Anrufer von getBuckets() aussehen wird:

getBuckets().then(
... 
) 

Vielen Dank im Voraus.

+0

Mit Angular 2 betrachten Observablen eher als Versprechen – jonrsharpe

+0

Ich glaube nicht, dass diese Frage ein Duplikat ist, weil die Antwort nicht unbedingt "wie Callbacks zu Versprechen zu konvertieren" ist aber eigentlich "aktualisieren Sie das AWS SDK und Sie werden Versprechen bekommen ". –

Antwort

1

Das AWS SDK für JavaScript hat verspricht seit Version 2.3.0 unterstützt 31. März veröffentlicht. Here's the annoucement.

Ich empfehle Ihnen, auf die neueste SDK-Version zu aktualisieren, wenn Sie etwas früher als 2.3.0 verwenden und dann Versprechen statt Rückrufe verwenden.

+0

Danke Mark. Ich war mir dessen nicht bewusst. Das hat mein Problem vollständig gelöst. – UnderWood

+1

@UnderWood fühlen Sie sich frei, es als die Antwort zu markieren. –

0

Sie können $ q verwenden, Documentatie hier: https://docs.angularjs.org/api/ng/service/ $ q

Das wäre in etwa so aussehen:

getBuckets() { 
    var deferred = $q.defer(); 
    var s3 = this.getS3(); 
    var params = {}; 
    s3.listBuckets(params, function(err, response) { 
     if (err) { 
      deferred.reject(err); 
     } 
     else { 
      deferred.resolve(response); 
     } 
    }) 
    return deferred.promise; 
} 
+0

Ist das Angular2? – UnderWood

+0

Oh verdammt Es tut mir leid nein ist es nicht. Ich habe gerade die Angular2-Dokumente überprüft, und es scheint einige größere Änderungen gegeben zu haben. Ich konnte $ q in den Angular2-Dokumenten nicht finden, sah aber etwas über Observable, wie @jonrsharpe erwähnt. – PeterH

0

Sie Ihr eigenes Versprechen wie diese erstellen:

var myPromiseFunction = function(iserr){ 

var deferred = $q.defer(); 

var myreturnvalue = 'somevalue'; 
if(iserr === true){ 

    deferred.reject('some error'); 

}else{ 

    deferred.resolve(myreturnvalue); 

} 

return deferred.promise; 

} 

Und nenne es so:

var throwerror = false; 

//or var throwerror = true; if you want to create an error 
myPromiseFunction(throwerror).then(function(res){ 

console.log(res); 

}).catch(function(err){ 

console.log(err); 

}) 

Auf diese Weise können Sie Versprechungen erstellen (sie müssen nicht einmal asynchron sein, aber sie haben keinen Zweck für nicht asynchrone Vorgänge.

+0

Danke für den Kommentar. Aber ist das Angular2? – UnderWood

+0

Nein, das ist die neueste 1. *. Ich weiß nicht, ob sie die Versprechen geändert haben. Probieren Sie den obigen Code in einem Controller oder etwas und Sie werden es wissen. (Vergiss nicht, $ q zu injizieren). Sie können Callbacks wie PeterH auflösen. – user3791775

3

Wenn Sie TypeScript verwenden, können Sie etwas wie promise zurückgeben. Ich kann mir vorstellen, es um die gleiche in der JavaScript-Stil wäre:

getBuckets() { 
    return new Promise(function (resolve, reject) { 
     var s3 = this.getS3(); 
     var params = {}; 
     s3.listBuckets(params, function(err, response) { 
      if (err) { 
       reject(err); 
      } 
      else { 
       resolve(response); 
      } 
     }) 
    }) 
} 
+0

Oder aktualisieren Sie einfach auf das neueste AWS SDK, das Versprechungen unterstützt. –