簡體   English   中英

自定義API的Nodejs Promise

[英]Nodejs Promise for custom api

我是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方法,該調用到達return data; (標有注釋),但then函數不會在start方法中執行?

那我在做什么錯?

更新:對不起,我忘了提及我使用的是bluebird而不是native promise如果這樣做有所不同?

不能從Promise構造函數中return -您必須調用resolve (預期會異步發生)。 您根本不需要在這里使用Promise構造函數 您可以忽略它,它應該可以工作。

  • Repo.UserModel的方法已經返回promise,因此您不必使用new Promise創建新的方法。
  • 您可以使用then讀取這些承諾中的值。
  • then還提供了一種轉換承諾的方法。 如果您在傳遞給函數的返回值thenthen會返回一個新的承諾,包裝你的返回值。 如果這個值是一個承諾,它將等待着。
  • 要將值轉換為承諾,可以使用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
})

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM