【发布时间】:2016-10-26 00:25:28
【问题描述】:
我使用 Express 进行路由,使用 Sequelize 进行数据库管理。
app.get('/api/users/:username', (req, res) => {
let username = req.params.username;
findChattersPerRole()
.then(chattersPerRole => {
console.log('instakbot should\'ve been added by now...');
});
});
函数 findChattersPerRole 将每个用户的用户名和角色作为另一个对象返回一个对象。
const findChattersPerRole = () => {
return fetch('https://tmi.twitch.tv/group/user/instak/chatters')
.then(parseJSON)
.then(r => {
let chatters = r.chatters;
let chattersPerRole = Object.keys(chatters).map(role => {
return chatters[role].map(username => {
console.log('findOrCreateViewer will be executed after this');
findOrCreateViewer(username, role);
return {
username: username,
role: role
};
});
});
return Promise.resolve(flattenDeep(chattersPerRole));
}).catch(err => {
console.log(`Error in fetch: ${err}`);
});
};
问题是,在我的路由中,我希望console.log('instakbot should\'ve been added by now...'); 在我的查看器插入数据库后执行,因为在我的函数 findChattersPerRole 中,我已经使用函数 findOrCreateViewer 插入了它们。我希望这会发生,因为在我的路线中,当 findChattersPerRole() 解决时,我会编写 console.log...
const findOrCreateViewer = (username, role) => {
return Viewer.findOrCreate({
where: {
username
},
defaults: {
instakluiten: 5,
role
}
}).spread((unit, created) => {
console.log('unit is: ', unit.dataValues.username);
if(created){
return `created is ${created}`;
}else{
return unit;
}
});
};
但是,在我的终端中,您可以看到事情并非如此......为什么我的承诺没有在预期的时间执行? Screenshot of my terminal
【问题讨论】:
-
findOrCreateViewer似乎是异步的,因此您希望该函数返回一个承诺并执行类似return Promise.all(chattersPerRole);之类的操作,其中chattersPerRole是一组承诺(由return findOrCreateViewer(username, role).then(() => ({username, role}));从@ 创建987654330@回调)。 -
所以我可能会说 .then(return Promise.resolve(unit));?
-
我不知道
.spread做了什么。它会返回一个承诺吗?如果是,那么您可能不需要更改该函数,但您必须对返回值做一些事情(如我的第一条评论所示)。目前你没有用它做任何事情:findOrCreateViewer(username, role);. -
是的价差返回一个承诺。哦,你在第一次编辑后就失去了我,我在这个问题上工作了很长时间,我的头很痛。为什么在这种情况下只调用 findOrCreateViewer(...) 是一件坏事,或者至少不是最好的决定?
-
因为你没有对返回的承诺做任何事情,所以在你继续做其他事情之前,你不知道它何时“完成”(即何时插入数据)。如果你依赖异步操作按顺序运行,你需要等待它们中的每一个都完成,这就是 Promise 给你的。
标签: javascript ecmascript-6 sequelize.js es6-promise