我正在为我的应用程序使用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(
...
)
提前致谢。
答案 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;
}
通过这种方式,您可以创建承诺(它们甚至不必是异步的,但它对于非异步操作没有任何意义。