在节点REPL

时间:2017-09-05 13:52:40

标签: javascript node.js promise

如果我启动一个节点REPL并调用一个返回一个promise的函数,那么该函数(显然)会立即返回,并且在控制台中会显示一些有关promise的信息:

$> node
> var foo = () => new Promise((resolve, reject) => setTimeout(resolve('yay'), 1000));
undefined
> foo().then(console.log)
Promise {
  <pending>,
  domain:
   Domain {
     domain: null,
     _events: { error: [Function: debugDomainError] },
     _eventsCount: 1,
     _maxListeners: undefined,
     members: [] } }

有什么方法可以让节点同步等待,以便解析(或拒绝)承诺,这样我就可以将结果打印到控制台了?

我已经看过像this one这样的问题,但是那里的解决方案都建议在.then()调用时执行我想要的结果(例如记录它)。但是,这似乎不起作用 - 请注意我在我的示例中已经有了这个,但我从来没有得到任何日志输出,所以我需要一些其他机制来保持进程旋转足够长的时间让我看到输出(示例中的字符串'yay')。

3 个答案:

答案 0 :(得分:2)

实际上,上面的例子中有一个错误。您立即解决了承诺,因此setTimeout不会做任何事情。如果您将该行更改为

  

var foo =()=&gt;新的承诺((解决,拒绝)=&gt; setTimeout(()=&gt;解决(&#39; yay&#39;),1000));

然后行为就像你描述的那样:

display: none

要解决此问题,您可以使用async / await来包装foo,如下所示:

display: block;

运行栏现在可以让您按预期打印(或检查)结果:

> var foo = () => new Promise((resolve, reject) => setTimeout(() => resolve('yay'), 1000));
undefined
> foo()
Promise {
  <pending>,
  domain: 
   Domain {
     domain: null,
     _events: { error: [Function: debugDomainError] },
     _eventsCount: 1,
     _maxListeners: undefined,
     members: [] } }

与您直接拨打> var bar = async () => { ... var res = await foo(); ... console.log(res); ... } 不同,最后一行会在一秒钟后打印出来。

答案 1 :(得分:1)

从版本8.4.0开始,节点REPL在打印时实际显示已解析的Promise的值:

$ node --version
v8.4.0
$ node
> var foo = () => new Promise((resolve, reject) => setTimeout(() => resolve('yay'), 3000));
undefined
> var p = foo()
undefined
> p
Promise {
  <pending>,
    domain: // Omitted for brevity
}
> // Wait 3 seconds...
> p
Promise {
  'yay',
  domain: // Omitted for brevity
}

如您所见,当Promise结算时,<pending>会被'yay'替换。

答案 2 :(得分:0)

从Node.js v10.0开始,您可以使用选项--experimental-repl-await在REPL中启用await

https://nodejs.org/api/cli.html#cli_experimental_repl_await

$> node --experimental-repl-await
> var foo = () => new Promise((resolve, reject) => setTimeout(resolve('yay'), 1000));
undefined
> await foo()
'yay'