• Promise.resolve()详解


    Promise.resolve等价于下面的写法

    有时需要将现有对象转为 Promise 对象,Promise.resolve方法就起到这个作用。

    Promise.resolve('foo')
    // 等价于
    new Promise(resolve => resolve('foo'))

    Promise.resolve方法的参数分成四种情况

    参数是一个 Promise 实例

    如果参数是 Promise 实例,那么Promise.resolve将不做任何修改、原封不动地返回这个实例。

    参数是一个thenable对象

    thenable对象指的是具有then方法的对象,比如下面这个对象

    let thenable = {
      then: function(resolve, reject) {
        resolve(42);
      }
    };
    

    Promise.resolve方法会将这个对象转为 Promise 对象,然后就立即执行thenable对象的then方法。

    let thenable = {
      then: function(resolve, reject) {
        resolve(42);
      }
    };
    
    let p1 = Promise.resolve(thenable);
    p1.then(function(value) {
      console.log(value);  // 42
    });
    

    thenable对象的then方法执行后,对象p1的状态就变为resolved,从而立即执行最后那个then方法指定的回调函数,输出 42

    参数不是具有then方法的对象,或根本就不是对象

    如果参数是一个原始值,或者是一个不具有then方法的对象,则Promise.resolve方法返回一个新的 Promise 对象,状态为resolved。

    const p = Promise.resolve('Hello');
    
    p.then(function (s){
      console.log(s)
    });
    // Hello

    由于字符串Hello不属于异步操作(判断方法是字符串对象不具有 then 方法),返回 Promise 实例的状态从一生成就是resolved,所以回调函数会执行。Promise.resolve方法的参数,会同时传给回调函数

    广州品牌设计公司https://www.houdianzi.com PPT模板下载大全https://redbox.wode007.com

    不带有任何参数

    Promise.resolve方法允许调用时不带参数,直接返回一个resolved状态的 Promise 对象。

    setTimeout(function () {
      console.log('three');
    }, 0);
    
    Promise.resolve().then(function () {
      console.log('two');
    });
    
    console.log('one');
    
    // one
    // two
    // three
    

    .then()函数里不返回值或者返回的不是promise,那么 then 返回的 Promise 将会成为接受状态(resolve)

    Promise.resolve().then(() => console.log(2)).then(() => console.log(3));
    console.log(1); // 1, 2, 3

    需要注意的是,立即resolve的 Promise 对象,是在本轮“事件循环”(event loop)的结束时执行执行,不是马上执行,也不是在下一轮“事件循环”的开始时执行

    原因:传递到 then() 中的函数被置入了一个微任务队列,而不是立即执行,这意味着它是在 JavaScript 事件队列的所有运行时结束了,事件队列被清空之后,才开始执行

    resolve()本质作用

    • resolve()是用来表示promise的状态为fullfilled,相当于只是定义了一个有状态的Promise,但是并没有调用它;
    • promise调用then的前提是promise的状态为fullfilled;
    • 只有promise调用then的时候,then里面的函数才会被推入微任务中;
  • 相关阅读:
    【cocos2d-x + Lua(2) C++和lua数据通讯之间的互调】
    【cocos2d-x + Lua(1) 绑定Lua并使用tolua++】
    【cocos2d-x 手游研发小技巧(6)聊天系统+字体高亮】
    【cocos2d-x 仙凡奇缘-网游研发(2) 角色换线系统】
    【cocos2d-x 仙凡奇缘-网游研发(1) 登录&注册】
    python数据分析---第04章 NumPy基础:数组和矢量计算
    python面向对象(一)
    python 常用模块之random,os,sys 模块
    (python数据分析)第03章 Python的数据结构、函数和文件
    python常用模块之时间模块
  • 原文地址:https://www.cnblogs.com/qianxiaox/p/14124551.html
Copyright © 2020-2023  润新知