为了账号安全,请及时绑定邮箱和手机立即绑定

resolve()的传值问题?

resolve()的传值问题?

回首忆惘然 2019-05-24 18:44:45
在你不知道的js里有这样一句话:如果传给resolve()的是一个非Promise,非thenable的立即值,这个promise就会立即用这个值完成,否则这个这个值会被递归的展开。首先这里的立即值就不太明白了?汇编?promise就会立即用这个值完成,这句话什么意思,是promise成功了的意思吗?否则这个这个值会被递归的展开??wtf...Promise,thenable的立即值被递归展开?
查看完整描述

2 回答

?
繁星淼淼

TA贡献1775条经验 获得超11个赞

这是一个好问题!不请自来!
Promise简单又让人很不容易掌握的一个对象。题主的问题核心是resolve返回的是一个值,还是一个新的Promise很呈现的结果是完全不同的。
返回值
即:
letp=newPromise((resolve,reject)=>{
resolve(1);//返回值
});
p.then(val=>{
console.log(val);//1
});
这一点毋庸置疑是我们日常经常写的Promise代码了。
返回新Promise
即:
letp=newPromise((resolve,reject)=>{
//返回新的Promise
returnnewPromise();
});
p.then(val=>{
console.log(val);//1
});
这个时候,p.then()会被暂停,直到内部新的Promise被resolve时才会执行。
也就是你上面说的所谓递归展开。
那什么时候需要呢?
假如我们需要一个HTTP请求之前需要先登录,那这种方法就好棒棒了。
functionlogin(){
returnnewPromise((resolve,reject)=>{
//success
resolve();
});
}
functionreq(url){
returnnewPromise((resolve,reject)=>{
if(!hasLogin)returnlogin();
//ajaxrequest
resolve();
});
}
req('/user/1').then(user=>{
})
以上!
Happycoding!
                            
查看完整回答
1 反对 回复 2019-05-24
?
婷婷同学_

TA贡献1844条经验 获得超8个赞

1.立即值这个说法倒是头一次听说,意思应该是对应thenable对象,立即值就是非thenable对象或者原始值,最起码在这句话是是这个意思
2.立即用这个值完成,Promise对象一被创建就会立即执行,也就是楼上说的第一个例子,如果resolve一个非thenable对象,Promise的状态就会立即变成resolved,然后在本轮事件轮询结束调用回调,这个立即完成其实是对应于resolve一个thenabel对象来说的,也就是你的第三个问题
//问题2简单示例
setTimeout(()=>console.log('setTimeout'),0);
varp=newPromise(resolve=>{console.log('newPromise');resolve('Promise_resolve');})
console.log(p)
p.then(v=>console.log(v));
console.log('console.log');
3.楼上对于这个问题提的例子是不准确的,应该是resolve(newPromise()),而不是returnnewPromise(),returnnewPromise()并不会改变Promise的状态
关于递归展开,如果resolve传递的一个Promise对象或者thenable对象,那么他不会立即resolved,而是会等待参数的状态来决定(前提是不resolve自身,否则会立即rejected),至于参数的状态如何决定最终状态,有点复杂,可以参考Promise/A+规范
                            
查看完整回答
反对 回复 2019-05-24
  • 2 回答
  • 0 关注
  • 1974 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号