Promise-01

Promise

Promise是一个对象,它代表了一个异步操作的最终完成或失败及其结果值。

使用Promise

本质上是一个函数返回的对象,我们可以在它上面绑定回调函数。这样就不需要一开始把回调函数作为参数传入函数中
示例:foo()函数接收一些配置和两个回调函数

  function successCallback(result) {
    console.log('创建成功')
  }
  function failureCallback(error) {
    console.log('出现错误')
  }
  ```
  普通调用:``foo(fooSettings, successCallback, failureCallback)``
  异步函数调用:
  ```javascript
    const promise = foo(fooSettings)
    promise.then(successCallback, failureCallback)
  ```
    或
  ```
    foo(fooSettings).then(successCallback, failureCallback)
  ```
### 约定
不同于“老式”的传入回调,在使用promise时,会有以下约定:
  + 在本轮事件循环运行完成之前,回调函数是不会被调用的
  + 即使异步操作已经完成,在这之后通过then()添加的回调函数也会被调用
  + 通过多次调用then()可以添加多个回调函数,它们会按照插入顺序执行
### 链式调用
连续执行两个或多个异步操作,在上一个操作执行成功后,开始下一个操作,并带着上一步操作返回的结果,可以通过Promise链实现;
链式调用可解决回调地狱的问题;
示例:
回调地狱:
```javascript
  doSomething(function(result) {
    dosomethingElse(result, function(newResult) {
      doThirdThing(newResult, function(finalResult) {
        conosle.log('Got teh final result' + finalResult)
      }, failureCallback)
    }, failureCallback)
  }, failureCallback)

Promise链:

  doSomething().then(function(result) {
    return doSomethingElse(result)
  })
  .then(function(newResult) {
    return doThirdThing(newResult)
  })
  .then(function(finalResult) {
    conosle.log('Got teh final result' + finalResult)
  })
  .catch(failureCallback)  // 相当于.then(null, failureCallback)
用箭头函数: 一定要有返回值,否则callback将无法获得上个promise的结果。
  doSomeThing().then( result => doSomethingElse(result) )
  .then( newResult => doThirdThing(newResult) )
  .then( finalResult => conosle.log('Got teh final result' + finalResult) )
  .catch(failureCallback)

链式操作中,可能会在一个回调失败后继续使用链式操作,可以在中间使用一个catch,抛出失败,之后再进行新的操作

时序

为避免意外,即使是一个已经变成resolve状态的Promise,传递给then()的函数也总会被异步调用;
传递到then()中的函数被置入到一个微任务队列中,而不是立即执行,即在JavaScript事件队列的所有运行结束时结束了,且事件队列被清空后,才开始执行
示例:

  const wait = ms => new promise(resolve => setTimeout(resolve, ms))
  wait().then(() => console.log(4))
  Promise.resolve().then(() => console.log(2)).then(() => console.log(3))
  console.log(1)
  // 1, 2, 3, 4

嵌套

嵌套Promise是一宗可以限制catch语句的作用域的控制结构写法。
示例:

  doSomething()
  .then(result => doSomeThingOptional()
    .then(optionalResult => doSomethingExtraNice(optionalResult))
    .catch(e => console.log(e.message))
  )
  .then(() => moreCriticalStuff())
  .catch(e => console.log("Critical failure: " + e.message))

Promise描述

一个Promise必然处于以下及几种状态之一:

  • 待定(pending):初始状态,既没有被兑现,也没有被拒绝
  • 已兑现(fulfilled):意味着操作成功完成
  • 已拒绝(rejected):意味着操作失败
posted @ 2021-12-20 11:37  _Miao  阅读(28)  评论(0编辑  收藏  举报