在你不知道的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)=>{//返回新的PromisereturnnewPromise();});p.then(val=>{console.log(val);//1});这个时候,p.then()会被暂停,直到内部新的Promise被resolve时才会执行。也就是你上面说的所谓递归展开。那什么时候需要呢?假如我们需要一个HTTP请求之前需要先登录,那这种方法就好棒棒了。functionlogin(){returnnewPromise((resolve,reject)=>{//successresolve();});}functionreq(url){returnnewPromise((resolve,reject)=>{if(!hasLogin)returnlogin();//ajaxrequestresolve();});}req('/user/1').then(user=>{})以上!Happycoding!
婷婷同学_
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+规范
添加回答
举报
0/150
提交
取消
