2016-06-18 2 views
1

Я использую Angular2 для моего приложения, и я должен использовать javascript для браузера Amazon S3. У меня есть следующие функции: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 является JavaScript API от Amazon для S3. Ожидается функция обратного вызова. Но вызывающий getBuckets ожидает Promise. Как я должен изменить выше getBuckets(), таким образом, что вызывающий getBuckets(), будет выглядеть следующим образом:

getBuckets().then(
... 
) 

Спасибо заранее.

+0

С Угловым 2 рассмотрим наблюдаемые, а не обещания – jonrsharpe

+0

Я не думаю, что этот вопрос является дубликатом, потому что ответ не обязательно «как преобразовать обратные вызовы в обещания», а на самом деле «обновить AWS SDK, и вы получите обещания ». –

ответ

1

АМС SDK для JavaScript поддерживает обещания, начиная с версии 2.3.0 выпущен 31 марта. Here's the annoucement.

Предлагаю вам обновить до последней версии SDK, если вы используете что-то раньше 2.3.0, а затем используйте обещания вместо обратных вызовов.

+0

Спасибо, Марк. Я не знал об этом. Это полностью решило мою проблему. – UnderWood

+1

@UnderWood не стесняйтесь отметить это как ответ. –

0

Вы можете использовать $ д, documentatie здесь: https://docs.angularjs.org/api/ng/service/ $ д

Это будет выглядеть примерно так:

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

Это Angular2? – UnderWood

+0

О, черт побери, я сожалею, что это не так. Я просто проверил документы Angular2 и, похоже, произошли некоторые серьезные изменения. Я не мог найти $ q в документах Angular2, но видел что-то о Observables, как упоминал @jonrsharpe. – PeterH

0

вы можете создать свой собственный посыл, как это:

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; 

} 

И назовите это так:

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); 

}) 

Таким образом, вы можете создавать обещания (они даже не должны быть асинхронными, но для неасинхронных операций не было бы никакой цели.

+0

Спасибо за комментарий. Но разве это Angular2? – UnderWood

+0

Нет, это последнее 1. *. Я не знаю, изменили ли они обещания. Просто попробуйте приведенный выше код в контроллере или что-то еще, и вы это узнаете. (не забудьте ввести $ q). Вы можете разрешать обратные вызовы, такие как PeterH. – user3791775

3

Если вы используете TypeScript, вы можете сделать что-то подобное, чтобы вернуть promise. Я могу себе представить, что это будет примерно то же самое в стиле JavaScript:

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

Или просто обновите до последнего AWS SDK, который поддерживает обещания. –