node中的promise的详解

  • 日期:03-16
  • 点击:(1642)


节点

中的承诺细节我已经阅读了很多关于承诺的解释,这些解释非常令人困惑,所以我写下这个详细的承诺,慢慢地仔细阅读这个博客,你会彻底理解承诺。

Introduction

promise是一个异步容器。它是ES6中的东西,不是node.js. promise容器所独有的,它包含异步任务。

有用和理由

承诺加载了异步函数,但是它可以将异步任务转换成同步。为什么我们在node.js中使用承诺?因为node.js是异步执行的,所以在执行下一个任务之前,node不会等待函数完成执行。在过去,如果您想将异步函数调用转换成同步,您只能使用回调函数来实现它。然而,回调地狱的代码会写得很难看,很难维护,所以承诺就产生了。然而,当我处理异步转换为同步时,承诺也是最常用的。

Usage

promise异步容器有三种状态:1。待定正在进行中;2.解析成功执行;3.拒绝未成功执行。

承诺中的异步任务将首先直接执行。如果此任务未能执行,将执行拒绝,如果执行成功,将执行解决。两个任务都可以返回值。返回值可以从下面获得。下面的解释非常清楚。

demo1

下面将解释一个非常典型的例子。

这里的逻辑如下:首先导入读取文件的模块,然后用异步读取文件的三个函数来执行它,但是这三个文件的调用顺序和执行顺序不能保证。

接着是接下来的回调地狱。

虽然这个调用可以保证函数执行的顺序,但是这个回调看起来复杂并且很难维护吗?因此,promise

promise_demo1

接下来解释一个用promise执行的异步任务。这里执行的步骤

print sequence

的运行逻辑如下。首先,肯定会打印1,因为js是一种解释性语言,第一个控制台. log肯定会首先执行。然后生成承诺容器,并执行其中的非异步函数,即控制台日志(“2”)。因为读取文件的函数是异步的,所以它将被异步执行,而非异步函数fn_2将被执行。然后会发现读取文件的异步函数将在完成之前执行。

以上是这个演示的执行顺序,但是我仍然看不到如何在这里实现同步,如果我不知道如何运行promise,很容易混淆。所以下面的例子可以很容易地看到

promise_dome2

的打印顺序如下

这里被修改为根据前一个同步。运行逻辑如下:首先,将执行第一个console.log,然后将创建一个承诺容器。承诺有两个参数解析拒绝,分别代表异步函数执行成功和函数执行失败调用的两个函数。然后执行内部的非异步函数,然后执行异步读取内部文件的函数。如果读取失败,将调用函数reject,并将错误参数放入函数中。如果执行成功,则执行函数解析。

然后下面将是承诺容器P p.then(),这段代码的意思是,当承诺容器中的异步函数完成时,then()中的函数将被执行。

以下是它的名称。它有两个功能。第一个函数意味着当异步函数成功执行时,调用resolve时将调用中的第一个函数。第二个函数是异步函数调用失败后调用的函数。这两个函数内部都有参数,内部的参数是解析和拒绝内部的参数。

然后我们可以看到console . log(“4”)是在上面的承诺函数执行之后执行的,所以可以形成同步。

p.then(函数(数据){

console.log(数据);

console . log(" 4 ");

},

function(err){

console . log(err)

})

promise _ demo 3

actually then(),之后您还可以使用then

then()。这意味着第二个then中函数的参数是第一个then的返回值,但是它在哪里被使用,例如通常在回调地狱中被使用。

运行结果

运行逻辑:逻辑如下:首先,等待P1承诺容器用完,然后将p2承诺容器返回给第二个,第二个等待p2用完,然后在p2用完后将P3返回给第三个,依此类推,从而实现同步调用,避免回调到地狱。

promise_demo3

我遇到了这样一种情况,我用一个函数包装了一个承诺容器,但是我想在外部调用函数时得到承诺内部的数据,所以我可以通过下面的方法得到它。

是返回函数中的承诺容器,然后使用then运行函数来获得我们想要的数据。这是我在处理mssql时想到的方法。

如果你对这个博客一无所知,或者一起讨论同步和异步通话,你可以添加我的QQ

-