zoukankan      html  css  js  c++  java
  • javascript primise本质——为了简化异步编码而针对异步操作的代理

    概述

    所谓Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。

    语法

    new Promise(executor);
    new Promise(function(resolve, reject) { ... });

    参数

    executor
    带有 resolve 、reject两个参数的一个函数。这个函数在创建Promise对象的时候会立即得到执行(在Promise构造函数返回Promise对象之前就会被执行),并把成功回调函数(resolve)和失败回调函数(reject)作为参数传递进来。调用成功回调函数(resolve)和失败回调函数(reject)会分别触发promise的成功或失败。这个函数通常被用来执行一些异步操作,操作完成以后可以选择调用成功回调函数(resolve)来触发promise的成功状态,或者,在出现错误的时候调用失败回调函数(reject)来触发promise的失败。

    描述

    Promise 对象是一个返回值的代理,这个返回值在promise对象创建时未必已知。它允许你为异步操作的成功返回值或失败信息指定处理方法。 这使得异步方法可以像同步方法那样返回值:异步方法会返回一个包含了原返回值的 promise 对象来替代原返回值。

    Promise对象有以下几种状态:

    • pending: 初始状态, 既不是 fulfilled 也不是 rejected.
    • fulfilled: 成功的操作.
    • rejected: 失败的操作.

    pending状态的promise对象既可转换为带着一个成功值的fulfilled 状态,也可变为带着一个失败信息的 rejected 状态。当状态发生转换时,promise.then绑定的方法(函数句柄)就会被调用。(当绑定方法时,如果 promise对象已经处于 fulfilled 或 rejected 状态,那么相应的方法将会被立刻调用, 所以在异步操作的完成情况和它的绑定方法之间不存在竞争条件。)

    因为Promise.prototype.then和 Promise.prototype.catch方法返回 promises对象, 所以它们可以被链式调用—— 一种被称为 composition 的操作。

    示例

    创建Promise

    这个小例子展示了Promise的机制。每当<button>被按下时,testPromise() 函数就会被执行。该函数会创建一个用window.setTimeout在1到3秒(随机)后用‘result’字符串完成的promise。

    这里通过p1.then方法的满足回调,简单的输出了promise的满足过程,这些输出显示了该方法的同步部分是如何和promise的异步完成解耦的。

    <!--标注:下面略微修改了英文版的示例,主要是执行3次testPromise()的效果,如果您有疑问,可以参看英文的说明文档:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise-->
    <div id="log"></div>
    <script>
        'use strict';
        var promiseCount = 0;
        function testPromise() {
            var thisPromiseCount = ++promiseCount;
    
            var log = document.getElementById('log');
            log.insertAdjacentHTML('beforeend', thisPromiseCount + ') 开始(同步代码开始)<br/>');
    
            // 我们创建一个新的promise: 然后用'result'字符串完成这个promise (3秒后)
            var p1 = new Promise(function (resolve, reject) {
                // 完成函数带着完成(resolve)或拒绝(reject)promise的能力被执行
                log.insertAdjacentHTML('beforeend', thisPromiseCount + ') Promise开始(异步代码开始)<br/>');
    
                // 这只是个创建异步完成的示例
                window.setTimeout(function () {
                    // 我们满足(fullfil)了这个promise!
                    resolve(thisPromiseCount)
                }, Math.random() * 2000 + 1000);
            });
    
            // 定义当promise被满足时应做什么
            p1.then(function (val) {
                // 输出一段信息和一个值
                log.insertAdjacentHTML('beforeend', val + ') Promise被满足了(异步代码结束)<br/>');
            });
    
            log.insertAdjacentHTML('beforeend', thisPromiseCount + ') 建立了Promise(同步代码结束)<br/><br/>');
        }
    </script>

    这个例子在按钮被按下后执行。你需要一个支持Promise的浏览器。你能通过短时间内按多次按钮看到不同的promise一个接一个的被完成。

    转自:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Promise

  • 相关阅读:
    Java密钥库的不同类型 -- 概述
    【Spring Boot】Filter
    【VUE】开发环境
    【Java Web开发学习】Spring 注解
    【TongWeb】问题记录
    python的u,r,b分别什么意思?
    nil
    goland安装
    vscode调试和设置
    函数类型
  • 原文地址:https://www.cnblogs.com/bonelee/p/6102356.html
Copyright © 2011-2022 走看看