yargs/yargs

`yargs.parse(argv,callback)` issues call back before handler promise is finished.

Open

#1,069 建立於 2018年2月12日

在 GitHub 查看
 (24 留言) (15 反應) (0 負責人)JavaScript (10,829 star) (1,053 fork)batch import
Help Wantedfeature requesttriaged

描述

yargs v11.0.0

When using yargs.parse() with a callback, expected behaviour is for callback to be called after yargs parse has completed. It is also expected that command handlers accept promises in their returns.

Example code:

const yargs = require('yargs');

yargs.command({
    command: 'test',
    description: 'a test command',
    handler: () => {
        return new Promise((resolve) => {
            setTimeout(() => {
                console.log('[Promise] finally executed');
                resolve('some result');
            }, 3000);
        });
    }
});

const callback = ()=>{
    console.log('[Yargs] Parse finished');
};

yargs.parse('test', (err, argv, output) => {
    callback(err, output);
});

console.log('[File] End');

outputs:

$ node index.js
[Yargs] Parse finished
[File] End
[Promise] finally executed 

expected:

[File] End
[Promise] finally executed 
[Yargs] Parse finished

Context: I'm using yargs inside REPL and need the callback to fire after the command has finished processing, so REPL can continue correctly.

Possibly linked issues: #510 : Adds in the Async handler support, but does not halt parse execution or pass promise back to user. #918 : possibly a feature request for this? #564 : Unanswered question on how to achieve this behaviour in yargs (though link provided to user space workaround/patch)

Workaround is discussed in #918 by attaching your promise to the argv and then checking it in the callback.

I would say that the callback in yargs.parse being called before command finishes could be seen as a bug, unless documentation is written to specify that it is expected behaviour and that async handlers will not halt execution of parse's callback.

貢獻者指南