Promiseまわりで有名なライブラリQを使ってる中でハマったのでメモ。
問題
QのPromiseはdoneとfailに加えてprogressにも対応しているので使いやすい。
resolveするとdoneのコールバックが呼ばれるように、notifyしたらprogressのコールバックが呼ばれる。
が、同期的にnotifyを呼ぶとコールバックが実行されない。
(new Q.Promise((resolve, reject, notify)=>{
notify('hoge');
resolve('piyo');
})).progress((val)=>{
//実行されない
console.log('progress', val);
}).done((val)=>{
//実行される
console.log('done', val);
});
解決
ソースを見るとnextTickしてprogressのコールバックを実行している。
deferred.notify = function (progress) { if (resolvedPromise) { return; } array_reduce(progressListeners, function (undefined, progressListener) { Q.nextTick(function () { progressListener(progress); }); }, void 0); };
なので非同期的にかけば実行される。
(new Q.Promise((resolve, reject, notify)=>{
setTimeout(()=>{
notify('hoge');
}, 0);
})).progress((val)=>{
//実行される
console.log('progress', val);
});