[英]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
還提供了一種轉換承諾的方法。 如果您在傳遞給函數的返回值then
, then
會返回一個新的承諾,包裝你的返回值。 如果這個值是一個承諾,它將等待着。 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.