私はDB管理のためにルーティングとSequelizeにExpressを使用しています。私は期待通りに約束していません
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}`);
});
};
問題は、私のルートでは、私は私の機能findChattersPerRoleに私はすでに機能findOrCreateViewerでそれらを挿入するので、私の視聴者がデータベースに挿入されてしまった、AFTER console.log('instakbot should\'ve been added by now...');
が実行されることを期待しています。私はしかし、私の端末では、あなたが、これはそれが起こっている方法ではないことがわかります
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)のような何かをしたいので、非同期であるように思わを使用する必要があります'.map'コールバックから' return findOrCreateViewer(username、role).then(()=>({username、role})); 'によって作成された約束のうちのどれかです。 –
だから、普及の代わりに、私は言うかもしれません。(返すPromise.resolve(ユニット)); – Kevin
'.spread'が何をするのか分かりません。それは約束を返しますか?はいの場合、おそらくその関数を変更する必要はありませんが、(最初のコメントに示されているように)戻り値で何かする必要があります。現在、あなたはそれを使って何もしていません: 'findOrCreateViewer(username、role);'。 –