NodeJs

Nodejs Promise

简介:回调(1)
  • Node.js 异步编程的直接体现就是回调。
  • 异步编程依托于回调来实现,但不能说使用了回调后程序就异步化了。
  • 回调函数在完成任务后就会被调用,Node 使用了大量的回调函数,Node 所有 API 都支持回调函数。
  • 回调函数一般作为函数的最后一个参数出现:
 简介:回调(2)
  • 例如,我们可以一边读取文件,一边执行其他命令,在文件读取完成后,我们将文件内容作为回调函数的参数返回。这样在执行代码时就没有阻塞或等待文件 I/O 操作。这就大大提高了 Node.js 的性能,可以处理大量的并发请求。
 回调地狱(厄运金字塔)(1)
  • 在Nodejs中大部分的I/O操作几乎都是异步的,也就是我们处理I/O的操作结果基本上都需要在回调函数中处理。
  • 当处理多个事件时回调函数就会一层层的嵌套,形成回调地狱。
 回调地狱(厄运金字塔)(2)
  • 例子,回调嵌套可以长成这样:
 Promise基础(1)
  • 例:生产者和消费者
  • 传递给 new Promise 的函数被称为 executor。当 new Promise 被创建,executor 会自动运行。
  • 它的参数 resolve 和 reject 是由 JavaScript 自身提供的回调。当 executor 获得了结果,无论是早还是晚都没关系,它应该调用以下回调之一。
 Promise基础(2)
  • executor 会自动运行并尝试执行一项工作。尝试结束后,如果成功则调用 resolve,如果出现 error 则调用 reject。
  • 由 new Promise 构造器返回的 promise 对象具有以下内部属性:
  • state — 最初是 “pending”,然后在 resolve 被调用时变为 “fulfilled”,或者在 reject 被调用时变为 “rejected”。
  • result — 最初是 undefined,然后在 resolve(value) 被调用时变为 value,或者在 reject(error) 被调用时变为 error。
 Promise基础(3)

Promise状态迁移图:

与最初的 “pending” promise 相反,一个 resolved 或 rejected 的 promise 都会被称为 “settled”。

 Promise基础(4)

例:成功执行

 Promise基础(5)

例:未成功执行

 Promise基础(6)
  • executor 只能调用一个 resolve 或一个 reject。任何状态的更改都是最终的。
  • 所有其他的再对 resolve 和 reject 的调用都会被忽略
  • resolve/reject 只需要一个参数(或不包含任何参数),并且将忽略额外的参数。
 Promise基础(7)
  • 如果有处理出了问题, executor 应该调用 reject。这可以使用任何类型的参数来完成(就像 resolve 一样)。但是建议使用 Error 对象(或继承自 Error 的对象)。
  • 实际上,executor 通常是异步执行某些操作,并在一段时间后调用 resolve/reject,但这不是必须的。我们还可以立即调用 resolve 或 reject。
  • Promise 对象的 state 和 result 属性都是内部的。我们无法直接访问它们。但我们可以对它们使用 .then/.catch/.finally 方法。
 Promise基础(8-1)

消费者: then, catch, finally

 Promise基础(8-2)
 Promise基础(8-3)
 Promise基础(8-4)
  • 消费者: then, catch, finally
 Promise基础(8-5)
  • 消费者: then, catch, finally
  • 就像常规 try {…} catch {…} 中的 finally 子句一样,promise 中也有 finally。
  • finally是执行清理(cleanup)的很好的处理程序(handler),例如无论结果如何,都停止使用不再需要的加载指示符(indicator)。
 Promise基础(8-6)
 Promise基础(9)
  • 如果 promise 为 pending 状态,.then/catch/finally 处理程序(handler)将等待它。否则,如果 promise 已经是 settled 状态,它们就会运行。
 Promise链(1)
 Promise链(2)
 Promise链(3)
  • .then(handler) 中所使用的处理程序(handler)可以创建并返回一个 promise。
  • 在这种情况下,其他的处理程序(handler)将等待它 settled 后再获得其结果(result)。
 Async/await(1)
  • Async/await 是以更舒适的方式使用 promise 的一种特殊语法,同时它也非常易于理解和使用。
  • async 确保了函数返回一个 promise,也会将非 promise 的值包装进去。它可以被放置在一个函数前面。
  • await 关键词,它只在 async 函数内工作。让 JavaScript 引擎等待直到 promise 完成(settle)并返回结果。
 Async/await(2)
  • await 实际上会暂停函数的执行,直到 promise 状态变为 settled,然后以 promise 的结果继续执行。这个行为不会耗费任何 CPU 资源,因为 JavaScript 引擎可以同时处理其他任务:执行其他脚本,处理事件等。
 Async/await(3)
  • 如果一个 promise 正常 resolve,await promise 返回的就是其结果。但是如果 promise 被 reject,它将 throw 这个 error,就像在这一行有一个 throw 语句那样。可以用promise.catch处理error
  • 我们也可以用 try..catch 来捕获上面提到的那个 error,与常规的 throw 使用的是一样的方式:
 Async/await(4)
  • 当我们使用 async/await 时,几乎就不会用到 .then 了,因为 await 为我们处理了等待。并且我们使用常规的 try..catch 而不是 .catch。这通常(但不总是)更加方便。
  • 但是当我们在代码的顶层时,也就是在所有 async 函数之外,我们在语法上就不能使用 await 了,所以这时候通常的做法是添加 .then/catch 来处理最终的结果(result)或掉出来的(falling-through)error,例如像上面例子12那样。
 简介:axios(1)
  • axios是基于promise(诺言)用于浏览器和node.js是http客户端。
  • axios主要是用于向后台发起请求的,还可在请求中做更多可控功能。
 简介:axios(2)

这是一段vue代码。