疑问比较大

疑问比较大

//把同步的任务转成异步任务

function createAsyncTask(syncTask){

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

//这函数作用是什么?将syncTask事件传进去转成promise对象,然后调用它的then方法,then方法的参数是syncTask事件本身,然后syncTask自调用?

}

createAsyncTask(()=>{

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

return 1+1;

})

.then(res=>{     //这里为什么要再调用then方法???createAsyncTask不是已经调用了then方法?

console.log(res);

})

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


正在回答

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

2回答

同学你好,

1、封装这个函数的作用就是将同步任务变成异步任务,因为promise中的resolve方法是异步执行的。

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

这里调用传入的方法,如果不调用,修改成同学那样,第一个‘我变成了异步任务!!!’是不能输出的。

2、这里的then是输出返回的结果:

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

如果没有返回promise的话,下面的then就会使用上一个返回的promise,参数res是传入的return结果。

3、同学的代码可以修改成这样:

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

可以如果不想在封装的方法中调用,可以在外面调用。

自己测试理解下,祝学习愉快!

  • 慕前端7432760 提问者 #1
    也就是说链式调用可以不在最后手动返回promise实例,.then方法本身就返回了一个promise实例。 如果手动返回实例,那就用手动返回的实例,否则用.then方法本身返回的promise实例,并且将返回值作为下一次调用.then方法时,resolve函数的参数 是这么理解吗?
    2019-07-13 17:09:29
  • 好帮手慕星星 回复 提问者 慕前端7432760 #2
    是可以这样理解的,没有问题。
    2019-07-13 17:20:23
  • 慕前端7432760 提问者 #3
    then本身会返回一个promise,但是如果不手动return Promise,那么默认返回的promise状态就是resolved,值看你return的是啥了,不写return的话,值是undefined,return非promise,那么值就是这个非promise。而手动return Promise,那返回的promise状态就不一定是resolved了,因此就可以改变下一个then/catch调用的结果了。 这样说更准确???
    2019-07-13 17:22:05
提问者 慕前端7432760 2019-07-12 09:35:22

我将代码转成如下的形式

function createAsyncTask(syncTask){

return Promise.resolve(syncTask);

}

createAsyncTask(()=>{

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

return 1+1;

})

.then(()=>{

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

return 1+1;   //这里返回2,但是返回值并不是一个promise实例啊,为什么接下来还能调用then??

})

.then(res=>{

console.log(res);

})

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


问题已解决,确定采纳
还有疑问,暂不采纳

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

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

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

在线咨询

领取优惠

免费试听

领取大纲

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