Async.whilst()中的Deferred.notify()在回调之前不会触发进度处理程序

时间:2016-12-29 05:16:24

标签: node.js promise q async.js

我有一个返回承诺的函数(使用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,但它似乎不会影响任何事情。

1 个答案:

答案 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;
}

至少,代码(在我看来)有点干净