我有一个返回承诺的函数(使用Q),并且通知似乎不会在正确的时间发生。 onFulfilled和onRejected回调按预期工作,但是在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这样的线程,说我需要在notify()周围包装一个setTimeout,但它似乎不会影响任何事情。
答案 0 :(得分:0)
我已经读过Promises + async.js没有混合(但是找不到任何可以说的东西!!),我真的不明白为什么应该这样做在这种情况下说实话是个问题
话虽如此,您所显示的代码似乎可以在没有异步的情况下实现,因此请尝试查看进度是否更好
function generateSentences(data, num, options) {
var deferred = Q.defer();
const markov = new Markov(data, options);
const genSentence = count => markov.generateSentence()
.then(result => {
console.log("Count: " + count);
deferred.notify(count / num); //update progress
if (count < num) {
return genSentence(count + 1);
}
});
markov.buildCorpus()
.then(() => genSentence(0))
.then(() => deferred.resolve(generatedSentences)) //finish
.catch(err => deferred.reject(err.toString()));
return deferred.promise;
}
至少,代码(在我看来)有点干净