How to resolve promises when using app with REPL
There are userland packages that implement this, for example https://github.com/skyrising/await-repl and https://github.com/StreetStrider/repl.js
Update: Node.js now does this by default and resolves promises
Old answer:
You can't resolve them proper - but you can extract their references to the global scope:
> Transaction.where('reference', '1').fetch().then((res) => out = res)
[Object Promise]
> out
/* your data outputted here since the global was assigned to*/
We might allow await
in the REPL in the future in Node which would solve the issue more cleanly.
Just setting a global return value may (and often will) show wrong results if not waiting for the promise fulfillment.
To ensure the user have a fulfilled promise you may provide your own evaluator to the repl
server:
// sample-repl.js
const repl=require('repl');
function replEvalPromise(cmd,ctx,filename,cb) {
let result=eval(cmd);
if (result instanceof Promise) {
return result
.then(response=>cb(null,response));
}
return cb(null, result);
}
repl.start({ prompt: 'promise-aware> ', eval: replEvalPromise });
Such REPL only returns control to the user after the promise got resolved:
$ node sample-repl.js
promise-aware> new Promise(resolve=>setTimeout(()=>resolve('Finished!'),5000));
'Finished!'
promise-aware> out = new Promise(resolve=>setTimeout(()=>resolve('Finished!'),5000));
'Finished!'
promise-aware> out
'Finished!'
promise-aware>
Note as it sets the proper global return variable with the resolved value.
The standard node REPL works like that instead:
> out = new Promise(resolve=>setTimeout(()=>resolve('Finished!'),5000));
Promise { <pending> }
> out
Promise { <pending> }
> out
Promise { <pending> }
> out
Promise { <pending> }
> out
Promise { 'Finished!' }
>