zoukankan      html  css  js  c++  java
  • [转载]es6 Promise.resolve()方法

    es6 Promise.resolve()方法

    Promise.resolve()方法

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

    
    
    1. const jsPromise = Promise.resolve($.ajax('/whatever.json'));

    上面代码将 jQuery 生成的deferred对象,转为一个新的 Promise 对象。

    Promise.resolve等价于下面的写法。

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

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

    (1)参数是一个 Promise 实例

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

    (2)参数是一个thenable对象

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

    
    
    1. let thenable = {
    2. then: function(resolve, reject) {
    3. resolve(42);
    4. }
    5. };

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

    
    
    1. let thenable = {
    2. then: function(resolve, reject) {
    3. resolve(42);
    4. }
    5. };
    6. let p1 = Promise.resolve(thenable);
    7. p1.then(function(value) {
    8. console.log(value); // 42
    9. });

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

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

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

    
    
    1. const p = Promise.resolve('Hello');
    2. p.then(function (s){
    3. console.log(s)
    4. });
    5. // Hello

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

    (4)不带有任何参数

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

    所以,如果希望得到一个 Promise 对象,比较方便的方法就是直接调用Promise.resolve方法。

    
    
    1. const p = Promise.resolve();
    2. p.then(function () {
    3. // ...
    4. });

    上面代码的变量p就是一个 Promise 对象。

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

    
    
    1. setTimeout(function () {
    2. console.log('three');
    3. }, 0);
    4. Promise.resolve().then(function () {
    5. console.log('two');
    6. });
    7. console.log('one');
    8. // one
    9. // two
    10. // three

    上面代码中,setTimeout(fn, 0)在下一轮“事件循环”开始时执行,Promise.resolve()在本轮“事件循环”结束时执行,console.log('one')则是立即执行,因此最先输出。

     
  • 相关阅读:
    strcat strcpy 使用出现的问题汇总
    MySql Host is blocked because of many connection errors; unblock with 'mysqladmin flush-hosts' 解决方法
    nginx 设置反响代理实现nginx集群
    js 去掉字符串最后一个字符
    二维数组 获取某键值集合
    oracle 序列
    递归数据查询
    oracle 递归查询
    jQuery EasyUI API 中文文档
    SecureCRT使用的技巧 键盘修改
  • 原文地址:https://www.cnblogs.com/sanmuqingliang/p/11812726.html
Copyright © 2011-2022 走看看