Angular2:回归承诺

时间:2016-06-18 20:44:59

标签: javascript amazon-web-services amazon-s3 angular promise

我正在为我的应用程序使用Angular2,我必须为浏览器使用Amazon S3 javascript sdk。 我有以下功能:

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

s3.listBuckets是Amazon for S3的javascript API。它期待回调功能。但getBuckets的调用者期待一个Promise。我应该如何更改上面的getBuckets(),以便getBuckets()的调用者看起来像:

getBuckets().then(
...
)

提前致谢。

4 个答案:

答案 0 :(得分: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);
            }
        })
     })
}

答案 1 :(得分:1)

AWS SDK for JavaScript支持自3月31日发布的2.3.0版以来的承诺。 Here's the annoucement

如果您使用的是2.3.0之前的版本,我建议您更新到最新的SDK版本,然后使用promises而不是回调。

答案 2 :(得分:0)

你可以在这里使用$ q,documentatie:https://docs.angularjs.org/api/ng/service/ $ q

这看起来像这样:

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

答案 3 :(得分:0)

你可以像这样创建自己的承诺:

commandsfile = input ("Please Enter CommandsFile path as c:/example/ \n :")
hostsfile = input ("Please Enter Hosts path as c:/example/ \n :")
commands1 = open( (commandsfile), "r")
hosts = open((hostsfile) , "r")
for host  in hosts:
    print ("1") 
    for cmd in commands1:
        print ("2 ")
    commands1.seek(0, 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;

}

通过这种方式,您可以创建承诺(它们甚至不必是异步的,但它对于非异步操作没有任何意义。