라우팅을 위해 Express를 사용하고 DB 관리를 위해 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로 삽입에서 실행될 것으로 기대합니다. 나는
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;
}
});
};
는하지만, 내 터미널에서이 그것이 일어나는 방법이 아니다 것을 알 수 있습니다 ... findChattersPerRole()가 해결되면 내 길에 나는 CONSOLE.LOG을 쓰기 때문에 이런 일이 기대 ... 예상 한 시간에 내 약속이 이행되지 않는 이유는 무엇입니까?
Screenshot of my terminal
를 사용해야합니다'findOrCreateViewer' 비동기 것 같다, 그래서 당신은 그 기능이 약속을 반환하고 그런 짓을 할'Promise.all (chattersPerRole)을 반환,'어디'chattersPerRole' 배열이다 ('map, .map' 콜백으로부터)'return findOrCreateViewer (username, role) .then (() => ({username, role})); –
그래서 확산 대신 나는 말할지도 모른다. (되돌아 감 Promise.resolve (단위))? – Kevin
나는'.spread'가 무엇을하는지 모른다. 그것은 약속을 되 돌리는가? 그렇다면 아마도 함수를 변경할 필요는 없지만 첫 번째 주석에 표시된대로 반환 값을 사용하여 무언가를해야합니다. 현재'findOrCreateViewer (username, role);'와 같이 아무것도하지 않고있다. –