У меня есть функция, которая возвращает обещание (используя Q), и уведомления, похоже, не происходят в нужное время. OnFulfilled и onRejected callback работают по назначению, но обратный вызов прогресса не срабатывает до тех пор, пока async.whilst() не закончит работу и не разобьет все сразу.Deferred.notify() внутри async.whilst() не вызывает обработчик хода до обратного вызова
Это функция
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()' instanti после создания 'отложенных', он ведет себя одинаково или иначе, чем ваш существующий обратный вызов? –
Возможно, именно поэтому смешивание обещаний и асинхронных задач считается «плохой вещью» * –
@ Roamer-1888, просто попробовал это, он ведет себя так же, как и существующий обратный вызов. Я не знал, что смешение обещаний и асинхронная работа - плохая практика , это моя первая попытка проекта nodejs. Тем не менее, я попытался найти другое решение из одного из ответов, которое устраняет потребности в async, но все еще страдает той же проблемой. –