我有一个返回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项目。这就是说,我试图从其中一个解决方案,消除异步的需要,但仍然遭受同样的问题 –