6

我正在尝试解除 AWS S3 异步功能,并遇到一个奇怪的错误。给定以下代码,

var s3 = new AWS.S3();
var when = require('when');
var nodefn = require('when/node');

var getObjectP = nodefn.lift(s3.getObject);

getObjectP({
    Bucket: 'bucket_name',
    Key: 'key_name'
})
.then(function(data) {
    ...
}, function(err) {
    ...
});

我得到这个错误,

Object #<Object> has no method 'makeRequest'

这是getObject正常的样子(当我使用回调而不是承诺时它工作正常):

s3.getObject({ ... }, function(err, data) {
    ...
});

我在滥用nodefn.lift吗?这似乎很简单。这是任何有兴趣的人的文档。https://github.com/cujojs/when/blob/master/docs/api.md#nodelift

4

2 回答 2

19

该方法可能具有错误的上下文,因为它没有被称为方法。试试看bind

var getObjectP = nodefn.lift(s3.getObject.bind(s3));
于 2014-07-10T23:30:52.337 回答
8

AWS Javascript SDK 现在支持 Promises ( https://aws.amazon.com/blogs/developer/support-for-promises-in-the-sdk/ )。您可以使用内置的 Promise 实现(如果您使用 ES6),也可以使用几个可用的 Javascript Promise 库之一。

使用When Promise 库

var AWS = require('aws-sdk');
AWS.config.setPromisesDependency(require('when'));
var s3 = new AWS.S3();

s3.getObject({
    Bucket: 'bucket_name',
    Key: 'key_name'
}).promise()
.then(function(data) {
    ...
}, function(err) {
    ...
});

使用 ES6 内置的 Promise 库

var AWS = require('aws-sdk');
var s3 = new AWS.S3();

s3.getObject({
    Bucket: 'bucket_name',
    Key: 'key_name'
}).promise()
.then(function(data) {
    ...
}, function(err) {
    ...
});

所以两者之间的区别是一条线。

于 2018-07-27T14:53:47.473 回答