Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在Node.js中显式完成承诺_Javascript_Node.js_Completable Future - Fatal编程技术网

Javascript 如何在Node.js中显式完成承诺

Javascript 如何在Node.js中显式完成承诺,javascript,node.js,completable-future,Javascript,Node.js,Completable Future,火焰警报 很简单:我非常熟悉Java completable futures: CompleteableFuture f = CompleteableFuture.supplyAsync(() -> "Hello").thenApply(s -> s.concat(" world")) 该代码后面可能有: CompleteableFuture word1 = f.thenApply(s -> s + " I am a completable future"); // "Hel

火焰警报

很简单:我非常熟悉Java completable futures:

CompleteableFuture f = CompleteableFuture.supplyAsync(() -> "Hello").thenApply(s -> s.concat(" world"))
该代码后面可能有:

CompleteableFuture word1 = f.thenApply(s -> s + " I am a completable future"); // "Hello world I am a completable future"
CompleteableFuture word2 = f.thenApply(s -> s + " I am teapot"); // "Hello world I am a teapot"
// option 1 (non blocking):
word1.thenAccept(System.out::println);
// option 2 (Blocking)
System.out.println(word1.get());
现在在node.js中:

const f = new Promise((resolve,reject) => {
    return resolve('Hello')
}).then(s => " world")
const word1 = f.then(s => s + ' I am a promise') // 'Hello world I am a promise'
const word2 = f.then(s => s + ' I am a teapot') // 'Hello world I am a teapot'

// option 1 (non blocking)
word1.then(console.log)
// option 2 (Blocking)
console.log(word1.???????)
节点js的“选项2”在哪里?如果没有这个,我不得不创建一个闭包来更新一个简单的值,而不是返回值

我宁愿有人说‘你不知道你在说什么’,让我看看,然后让我的无知继续下去

您可以使用,它会立即返回已兑现的承诺

Promise.resolve( "Hello" )
    .then( s => console.log(s + " world") ); // Outputs "Hello world"
如果你想立即拒绝一个承诺,还有一个问题

然而,据我所知,不可能像您所描述的那样以同步/阻塞的方式从承诺中获得结果。最接近的特性是async/await,它只是暂时的,并且不是同步的。它只允许使用与同步调用类似的语法。它允许您编写如下函数:

async function returnString () {
  let s = await Promise.resolve( "Hello" ).then( s => s + " world" );
  console.log( s ); // Outputs "Hello world"
}

returnString();
有一个函数允许您使用本质上是异步/等待多边形填充的函数


async/await在Node.js 7.3+和中,它支持暂时还不稳定的阶段性功能,8.0+中没有标志,除此之外,它还可以被转换为在更多环境中可用的功能

node.js无法使非阻塞异步操作突然变为阻塞和同步。但事实并非如此。它是一个事件驱动的环境,几乎所有的I/O都是非阻塞和异步的。要使用node.js环境,请使用它进行编程。而且,根据规范
p.then()
始终是异步的。
.then()
处理程序将始终在事件循环的某个未来周期中被调用,即使
p
已被解析。仅供参考。async/await只是告诉解释器自动包装
.then()
处理程序中的代码。这是一种语法上的便利。在使用async/await时,以前异步和非阻塞的所有内容仍然是异步和非阻塞的。而且,如果您现在想使用async/await,您可以使用BabelJS来传输代码。啊,感谢@jfriend00的澄清,我会确保我的回答中清楚无误。如果不使用babel传输文件,我如何才能做到这一点?使用承诺是很好的,但在某一点上,你必须知道它已经完成了。@ChristianBongiorno我已经看过了,实际上没有一种方法可以像你描述的那样以同步的方式完成它。正如jfriend00所指出的,即使是
async/await
也只是语法上的糖分。这实际上是Node.js实现方式的结果,是非阻塞的。如果你在结束之前有一大堆事情需要处理,你可以通过向客户提供一系列的承诺来让事情变得更容易管理,但除此之外,你几乎需要利用回调/解析。如果不在最后创建一个闭包,我想不出有什么办法可以做到这一点。
async function returnString () {
  let s = await Promise.resolve( "Hello" ).then( s => s + " world" );
  console.log( s ); // Outputs "Hello world"
}

returnString();