我有一個返回promise(使用Q)的函數,並且通知似乎並沒有在正確的時間發生。 onFulfilled和onRejected回調按預期工作,但進度回調只有在async.whilst()完成運行後纔會觸發,並立即觸發所有內容。async.whilst()中的Deferred.notify()在回調之前不會觸發進度處理程序
這是函數
function generateSentences(data, num, options) {
var deferred = Q.defer();
const markov = new Markov(data, options);
markov.buildCorpus()
.then(() => {
var count = 0;
async.whilst(
function() { return count < num; },
function (callback) {
markov.generateSentence()
.then(result => {
console.log("Count: " + count);
deferred.notify(count/num); //update progress
count++;
callback(null);
}, (err) => {
deferred.reject(err.toString());
count++;
});
},
function (err, n) {
//PROGRESS EVENTS DON'T HAPPEN UNTIL HERE
deferred.resolve(generatedSentences); //finish
}
);
}, (err) => console.log(err));
return deferred.promise;
}
,這是使用承諾
function generateScript() {
fs.readdir(parser.videoBasePath, function (err, files) {
parseFiles(files, parser.parse).then((a) => {
console.log("Total Lines: " + fullScript.length + "\n");
fullScript = _.shuffle(fullScript);
markov.generateSentences(fullScript, 20).then((data) => {
console.log(data);
}, (err) => {
console.log(err);
}, (progress) => {
console.log(progress);
});
});
});
}
我讀過一些線程像this說我需要環繞通知()一個setTimeout的,但它似乎沒有影響任何東西。
診斷,如果你註冊進度回調內'generateSentences()'immedi在創建'deferred'之後,它的行爲與現有的進度回調相同還是不同? –
也許這就是爲什麼混合承諾和異步被認爲是*壞事要做的* –
@ Roamer-1888,剛剛嘗試過,它的行爲與現有的回調相同。我不知道混合promise和async是不好的練習,這是我第一次嘗試一個nodejs項目。這就是說,我試圖從其中一個解決方案,消除異步的需要,但仍然遭受同樣的問題 –