首页 文章

在客户端代码中未定义Bluebird promise resolve(数据)

提问于
浏览
3

Hiyas . 我有一个简单的应用程序,其中客户端期望作为结果的承诺,但在调用resolve()方法时,promise将继续返回undefined作为结果 .

客户端代码:

UsersRepo.findOneAsync({id: id}).then(function(err, result) {
    console.log("UserService promise resolution", err, result);
});

对于错误和结果,它分别输出“null”和“undefined”

正在进行工作并返回承诺的代码:

findOneAsync: function(args) {
    var where = ""; //omitted

    var promise = new Promise(function(resolve, reject) {
        db.query("Select * from users" + where + " limit 1", function(err, result) {
            var res = { id: 1, username: 'username', firstName: 'First', lastName: 'Last' };

            if(err != null) {
                console.log("REJECT", err);
                reject(err);
            }
            else {
                console.log("RESOLVE", res);
                resolve(null, res);
            }
        });
    });

    return promise;
}

如您所见,我只是为此测试返回一些静态数据('res'变量) . 在客户端代码中,控制台语句始终打印出:

UserService promise resolution null undefined

我不懂 . 看起来我正在做的一切正确:用数据调用resolve()方法,客户端代码正确使用.then(函数(错误,结果)),所以看起来如此 . 为什么不从客户端收到数据?

谢谢你的帮助!

==>

Solution:

如下所述,Bluebird的拒绝和解决只接受一个论点 . 第一个'null'只被看到了 . 将代码更改为'resolve(res)'工作 . 多谢你们 .

2 回答

  • 1

    Resolve / Reject都接受一个参数...因此你的结果是未定义的,因为你传递给resolve的第二个值永远不会被使用,第一个值是null

    你想要做的是

    UsersRepo.findOneAsync({id: id}).then(function(result) {
        console.log("UserService promise resolution", result);
    }).catch(function(err) {
        console.log("UserService promise error", err);
    });
    
    findOneAsync: function(args) {
        var where = ""; //omitted
    
        var promise = new Promise(function(resolve, reject) {
            db.query("Select * from users" + where + " limit 1", function(err, result) {
                var res = { id: 1, username: 'username', firstName: 'First', lastName: 'Last' };
    
                if(err != null) {
                    console.log("REJECT", err);
                    reject(err);
                }
                else {
                    console.log("RESOLVE", res);
                    resolve(res);
                }
            });
        });
    
        return promise;
    }
    
  • 7

    Bluebird的 then 不接受 err . 相反,然后接受两个函数,第一个用于解析,第二个用于拒绝 . 您也可以使用 catch 来处理错误 .

    http://bluebirdjs.com/docs/api/then.html

    编辑:@JaromandaX是正确的,解析函数应该只接受一个参数 .

    除了不期望错误对象传递到 then 回调之外,您应该只有 resolve(res) .

相关问题