zoukankan      html  css  js  c++  java
  • promise对象总结

    一.Promise是异步编程的一种解决方案,它是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。从语法上说,Promise 是一个对象,从它可以获取异步操作的消息。Promise 提供统一的 API,各种异步操作都可以用同样的方法进行处理。promise对象是一个构造函数,用来生成Promise实例;

    二.promise的两个特点    对象状态不受外界影响 && 一旦状态改变,就不会再变,任何时候都可以得到结果(pending状态-->fulfilled || pending-->rejected)

    基本用法  函数作为参数,该函数两个参数resolve和reject

    const promise = new Promise(function(resolve,reject) {
      ...
      if(/*异步操作成功*/){
        resolve(value)
      }else{
        reject(error)
      }
    })

    三.Promise方法

      1.promise.prototype.then():Promise 实例添加状态改变时的回调函数,有两个参数resolve和reject的分别操作

      一般来说,调用resolvereject以后,Promise 的使命就完成了,后继操作应该放到then方法里面,而不应该直接写在resolvereject的后面。所以,最好在它们前面加上return语句,这样就不会有意外。

    new Promise((resolve, reject) => {
      return resolve()
      //后面语句不会执行
      console.log('dd')
    })

      2.promise.prorotype.catch():是.then(null, rejection)的别名,用于指定发生错误时的回调函数。

    getJSON('/posts.json').then(function(posts) {
      // ...
    }).catch(function(error) {
      // 处理 getJSON 和 前一个回调函数运行时发生的错误
      console.log('发生错误!', error);
    });

    建议总是使用catch方法,而不使用then方法的第二个参数

    // bad
    promise
      .then(function(data) {
        // success
      }, function(err) {
        // error
      });
    
    // good
    promise
      .then(function(data) { //cb
        // success
      })
      .catch(function(err) {
        // error
      });

    如果没有使用catch方法指定错误处理的回调函数,Promise 对象抛出的错误不会传递到外层代码,即不会有任何反应。一般总是建议,Promise 对象后面要跟catch方法,这样可以处理 Promise 内部发生的错误。catch方法返回的还是一个 Promise 对象,因此后面还可以接着调用then方法。

      3.promise.prototype.finally():用于指定不管 Promise 对象最后状态如何,都会执行的操作。该方法是 ES2018 引入标准的。

    promise
    .then(result => {···})
    .catch(error => {···})
    .finally(() => {···});

      4.promise.all():用于将多个 Promise 实例,包装成一个新的 Promise 实例。

    promises是包含 n 个 Promise 实例,只有这n 个实例的状态都变成fulfilled,或者其中有一个变为rejected,才会调用Promise.all方法后面的回调函数。

      5.promise.race()同样是将多个 Promise 实例,包装成一个新的 Promise 实例。

      6.promise.resolve()将现有对象转为 Promise 对象,Promise.resolve方法就起到这个作用

      7.promise.reject()也会返回一个新的 Promise 实例,该实例的状态为rejected

      8.promise.try()

    Promise.try(database.users.get({id: userId}))
      .then(...)
      .catch(...)

     参考 https://segmentfault.com/a/1190000010399626  执行顺序有介绍

    参考 http://web.jobbole.com/91406/    promise原理  实现

    人是在一天天内提高的,只有不断努力才不会被淘汰!
  • 相关阅读:
    Oracle報錯︰ORA-12638 證明資料擷取失敗
    tomcat启动startup.bat一闪而过[转]
    供应商术语
    如何在本地设置www.xxx.com,使其允许访问
    windows 安装包位置
    Windows Mobile系列学习四:Windows Mobile如何进行打包、设置打包显示图标
    Windows Mobile系列学习二:Windows Mobile 模拟器如何设置网络连线
    Windows Mobile的程式安装的手持机上如何设置开机自动启动功能?
    Java篇:树和Map
    JAVA篇:Java 多线程 (八)多线程下其他组件
  • 原文地址:https://www.cnblogs.com/bais/p/8795726.html
Copyright © 2011-2022 走看看