【问题标题】:Bluebird promisify on function with return valueBluebird 承诺函数返回值
【发布时间】:2014-07-05 22:41:05
【问题描述】:

我想在 AWS putItem 函数上使用 Bluebird 的 promisify 函数。从文档中注意到它返回一个 AWS.Request 对象。我对那个对象不感兴趣,理想情况下我会调用 db.putItem({...});并得到一个承诺。这可能吗?当我尝试它时,promisify'd 函数仍然返回一个 AWS.Request 对象,我认为这是合理的,在这种情况下它不是我想要的。

目前我只是创建一个 Promise 对象并将成功和错误数据手动映射到解决/拒绝承诺函数,但感觉就像我在编写不必要的样板代码,因为除了返回值之外, putItem 函数(可能还有其他函数)似乎非常适合 promisify。

根据要求,以下是代码的相关部分:

//datastore.js

var AWS = require('aws-sdk');

var sharedDB;

if (!sharedDB) {
    AWS.config.update({accessKeyId: 'akid', secretAccessKey: 'secret', region: "us-west-2"});
    sharedDB = new AWS.DynamoDB();
    sharedDB.setEndpoint("http://localhost:8000");
    Promise.promisify(sharedDB.putItem); 
}

module.exports.sharedDB = sharedDB;

//user.js

var db = require('../datastore/dynamoDBConnection').sharedDB;
var Promise = require("bluebird");


function User() {
var user = this;
...

user.save = function () {
        var params = {
            Item: {
                username: {S: 'test'},
                passwordHash: {S: 'test'}
            },
            TableName: 'users',
            Expected: {
                username: {Exists: false}
            }
        };
        return db.putItem(params); //this is where I would like have a Promise returned.  Instead I get an AWS.Request object.
}
...
}

【问题讨论】:

  • 虽然那里有很多细节,但该帖子缺少我询问的特定用例,即在使用回调的函数上使用 promisify,但也返回一个值。跨度>
  • 我想我可以根据您对引用答案的回答来改写我的问题:从第三个选项开始,我还能做“Promise.promisify(getStuff);”吗?如果 getStuff 函数也有返回值?
  • 它返回什么样的值?它会以错误和结果回调回调吗?如果不是,它如何传达发生了错误?
  • Promisify returns 修改函数,它不会就地改变它

标签: node.js amazon-web-services promise amazon-dynamodb bluebird


【解决方案1】:

更新

你用错了 Promisify,它返回 promisified 函数。

var putItemAsync = Promise.promisify(sharedDB.putItem); 

并使用putItemAsync。此外,您应该只调用一次 promisify 一次 并缓存它。


PutItem 接受一个回调,但它通过流解析,因此承诺它比平时要复杂一些。

return new Promise(function(resolve,reject){
    dynamoDB.putItem(
    {"TableName":"Table1",
        "Item":{
            "Color":{"S":"white"},
            "Name":{"S":"fancy vase"},
            "Weight":{"N":"2"}
        }
    }, function(result) {
        var wholeResult = [];
        result.on('data', function(chunk){
            wholeResult.push(chunk);
        });
        result.on('end', function(){ resolve(Buffer.concat(wholeResult))});
        result.on('error', function(e){ reject(new Error(e)); });
    });
});

【讨论】:

  • 也许我应该更具体一些。我正在使用 dynamoDB api,它不会流式传输结果。它只是提供了一个反序列化的对象。
  • @user605331 那么Promise.promisify(getStuff) 有什么问题?
  • 我认为我可以这样做,但是当我这样做然后调用修改后的函数时,它会返回 AWS.Request 对象,而不是 Promise。
  • 我很抱歉没有发布带有原始问题的代码。我认为这是功能文档足以知道它是否有效的地方。这似乎比我想象的要复杂。问题已用代码更新。
猜你喜欢
  • 2016-04-15
  • 1970-01-01
  • 1970-01-01
  • 2019-01-23
  • 2017-04-09
  • 2020-08-26
  • 2016-07-27
  • 2017-04-05
相关资源
最近更新 更多