我的理解有误吗?

我的理解有误吗?

function createAsyncTask(syncTask) {

return Promise.resolve(syncTask).then(syncTask => syncTask());

   // syncTask传进Promise.resolve()里,因为在调用createAsyncTask时,syncTask是一个匿名函数,Promise.resolve(syncTask)返回一个新的Promise对象,并且状态为resolved。执行then中的回调函数,打印出createAsyncTask返回的值1+1

  //传递进来的syncTask方法放在then中去调用,使syncTask变为异步任务

}

// createAsyncTask()是同步任务,会立即执行

// then方法绑定了syncTask函数,使得函数在所有同步任务执行后才执行


createAsyncTask(() => {

console.log('我变成了异步任务!!!');

return 1 + 1;

}).then(res => {

console.log(res);

});


console.log('我是同步任务!');


另外,当Promise.resolve()传入的是thenable对象,Promise.resolve()会将thenable对象转为Promise对象,然后立即执行方法。then方法指的是function(resolve,reject){console.log('1')吗?

let thenable={then:function(resolve,reject){console.log('1')}}


Promise.resolve()传入的是thenable对象,转成promise对象的状态是resolved还是rejected?

正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

2回答
好帮手慕慕子 2019-07-04 11:07:31

同学你好,你的理解是对的,注释中的疑问参考下面的解答

  1. then方法指的是function(resolve,reject){console.log('1')}, 可以将你定义的thenable对象传入resolve中, 查看打印结果

    http://img1.sycdn.imooc.com//climg/5d1d678100013bff06840181.jpg

    打印结果:表示是立即执行了该方法, 在前面的异步执行方法之前输出了1哦

    http://img1.sycdn.imooc.com//climg/5d1d67930001668e04320150.jpg

  2. 如果参数是thenabled对象(有then方法的对象),返回的promise会跟随这个thenable的对象,采用它的最终状态(指resolved/rejected/pending);示例:

    (1)thenabled对象的状态为resolved, 转成的Promise对象状态也为resolved

        http://img1.sycdn.imooc.com//climg/5d1d6bbf0001d62605600205.jpg

        http://img1.sycdn.imooc.com//climg/5d1d6bd90001851104460133.jpg

        (2)thenabled对象的状态为rejected, 转成的Promise对象状态也为rejected

            http://img1.sycdn.imooc.com//climg/5d1d6c41000189d506610290.jpg

            http://img1.sycdn.imooc.com//climg/5d1d6c580001dbc805010128.jpg

        (3)不做任何处理, 表示pending状态

            http://img1.sycdn.imooc.com//climg/5d1d6cab000162f705130169.jpg

            http://img1.sycdn.imooc.com//climg/5d1d6cbd0001a1fc04920136.jpg

综上可知,Promise.resolve()接收thenabled对象(有then方法的对象),转成的Promise对象状态会取决于thenable对象的then方法最终状态。

同学可以结合示例, 自己下去测试一下, 加深理解哦

            


见信 2019-07-03 23:27:11

我也是刚看完这部分视频,我的理解简单粗暴。

要在异步里面执行同步时的任务,那就把这个任务传入Promise对象中,在promise.resolve执行就行了。

第一步,我们把这个些要执行的同步任务,以匿名函数的形式包裹,然后作为参数传入了createAsyncTask函数中。

第二步,我们在createAsyncTask中初始化并返回了一个promise对象,然后我们把刚才传入的同步任务又以匿名函数(也可以说是回调函数)的形式传入了promise.resolve用做.resolve的参数。

第三步,当promise.resolve能够成功执行时,也就是说我们成功地进行了异步请求,就会执行resolve方法,所以,我们在.then里的第一个回调函数内,执行了这个一直以回调函数的形式传了2遍的匿名函数,做到了同步任务转为异步任务。

关于你一直说的状态这些,老师没说,我也没懂,前面唯一讲了的状态分别是fulfilled,rejected与pending这三个。

关于thenable对象的:

如果传入Promise.resolve的是一个thenable对象,那么会先立即执行then方法,然后才是执行resolve方法(也就是上面的cb函数)。

.than()只能接受两个参数,这两个参数是两个回调函数,第一个是resolve回调函数,第二个是rejected回调函数。——也就是说,其实无论在哪调用resolve()还有rejected(),它们的函数的定义或者说是实现都是在.then里面,所以会先立即执行then方法,“我被执行了”才是执行resolve方法,“哼!”。也或者是,它先执行了resolve方法,然后执行then方法,但是你的resolve方法此时没有实现,就跟没有执行一样,如同一开始老师讲promise时。

function f(){
        return new Promise(function(resolve,reject){
            setTimeout(function() {
                console.log('1');
                resolve();
                console.log('2');
            }, 1000);
        })
    }

    f();

你调用了f(),1S之后输出了1然后是2,因为你没有写.then,没有resolve的定义。

而如果你写了.then,如下:

f().then(function(){
        console.log('3');
    });

那么,输出的就是1 2 3。不难看出,无论是哪种,回调,也就是resolve方法都是最后执行的


  • 见信 #1
    我也不知道我的理解是不是全对,如果有问题,老师跟我说下。
    2019-07-03 23:31:53
  • 同学你好, 你的理解是可以的, 不过“resolve方法都是最后执行的”这句话可以换个方式理解。 因为他是异步事件, 会在同步事件执行之后才开始执行。所以总结就是异步事件实在同步事件执行完才执行的。祝学习愉快~~~
    2019-07-04 11:13:02
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师