Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/419.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Nodejs对定制api的承诺_Javascript_Node.js_Promise_Bluebird - Fatal编程技术网

Javascript Nodejs对定制api的承诺

Javascript Nodejs对定制api的承诺,javascript,node.js,promise,bluebird,Javascript,Node.js,Promise,Bluebird,我不熟悉nodejs并使用promise,实际上这是我第一个真正使用nodejs的应用程序 所以我读了一整天书,我有点困惑 这是我的模块: function User() { var self = this; self.users = {}; self.start = function (user, botId) { return new Promise(function () { return get(user).then(f

我不熟悉
nodejs
并使用
promise
,实际上这是我第一个真正使用
nodejs
的应用程序

所以我读了一整天书,我有点困惑

这是我的模块:

function User() {
    var self   = this;
    self.users = {};

    self.start = function (user, botId) {
        return new Promise(function () {
           return get(user).then(function (data) {
                debug(data);
                if (data.botId.indexOf(botId) === false) {
                    return Repo.UserBotModel.addUser(user.id, botId).then(function () {
                        data.botId.push(botId);
                        return data;
                    });
                } else
                    return data;
            });
        });
    };

    self.getDisplayName = function (user) {
        if (user.real_name)
            return user.real_name;
        if (user.last_name)
            return user.firstname + ' ' + user.last_name;
        return user.first_name;
    };
    /**
     * check if user exist in our database/memory cache and return it,
     * otherwise insert in the database and cache it in memory and the return it
     * @param user
     */
    function get(user) {

        return new Promise(function () {

            //check if user is loaded in our memory cache
            if (self.users.hasOwnProperty(user.id))
                return self.users[user.id];
            else {
                //get from database if exist
                return Repo.UserModel.get(user.id).then(function (rows) {
                    if (rows && rows.length) {
                        //user exist cache it and resolve
                        var data = rows[0];
                        if (data.botId && data.botId.length)
                            data.botId = data.botId.split(',');
                        else
                            data.botId = [];

                        self.users[user.id] = data;
                        //------------------------------ code execution reaches here
                        return data;
                    }
                    else {
                        //user dose not exist lets insert it
                        return Repo.UserModel.insert(user).then(function (result) {
                            return get(user);
                        });
                    }
                });
            }
        });
    }
}
我调用
start
方法,该方法调用私有get方法,调用到达
返回数据
(用注释标记),但是
那么
函数没有在
启动
方法中执行

那么我做错了什么

更新:抱歉,我忘了提到我使用的是
bluebird
,而不是
native promise
,如果这有区别的话

You-您必须调用
resolve
(预期异步发生)。你根本不应该在这里。您可以忽略它,它应该可以工作。

您-您必须调用
resolve
(预期异步发生)。你根本不应该在这里。您可以省略它,它应该会起作用。

  • 您的
    Repo.UserModel
    中的方法已经返回了承诺,因此您不必使用
    newpromise
    创建新的承诺
  • 您可以使用
    然后
    读取这些承诺中的值
  • 然后
    还提供了一种转换承诺的方法。如果您在传递给
    的函数中返回一个值,那么
    将返回一个新的承诺,该承诺将封装您返回的值。如果这个值是一个承诺,我们将等待它
    
  • 要将值转换为承诺,可以使用
    promise.resolve
知道了这一点,您可以简化
get
,如下所示:

function get(user) {
    if (...) {
        return Promise.resolve(...)
    } else {
        return Repo.UserModel.get(...).then(function(rows) {
            ...
            return ...
        })
    }
}
此版本的
get
将始终返回一个承诺,您可以这样使用:

get(...).then(function(resultOfGet) {
    // process resultOfGet
})
  • 您的
    Repo.UserModel
    中的方法已经返回了承诺,因此您不必使用
    newpromise
    创建新的承诺
  • 您可以使用
    然后
    读取这些承诺中的值
  • 然后
    还提供了一种转换承诺的方法。如果您在传递给
    的函数中返回一个值,那么
    将返回一个新的承诺,该承诺将封装您返回的值。如果这个值是一个承诺,我们将等待它
    
  • 要将值转换为承诺,可以使用
    promise.resolve
知道了这一点,您可以简化
get
,如下所示:

function get(user) {
    if (...) {
        return Promise.resolve(...)
    } else {
        return Repo.UserModel.get(...).then(function(rows) {
            ...
            return ...
        })
    }
}
此版本的
get
将始终返回一个承诺,您可以这样使用:

get(...).then(function(resultOfGet) {
    // process resultOfGet
})

getDisplayName
应该是
user
的一种方法,或者是一个静态函数。您应该将承诺本身缓存在
users
中,而不是
data
值中-请参见示例
getDisplayName
应该是
user
的一种方法,或者是一个静态函数。您应该将承诺本身缓存在
users
中,不是
数据
值-请参见示例X我没有注意到
Promise.resolve
可以与文字值一起使用NX我没有注意到
Promise.resolve
可以与文字值一起使用