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
可以与文字值一起使用