JavaScript Promise语法差异疑问:两种写法的原理困惑
解惑:
getUserMedia这类内置API返回Promise的工作原理 嘿,我太懂你这种困惑了!你已经把手动用new Promise()创建实例的基础逻辑摸得门儿清,但碰到像navigator.mediaDevices.getUserMedia()这种直接返回Promise、完全看不到你熟悉的构造函数写法的场景,肯定会忍不住琢磨——这背后到底藏着啥知识点?
核心真相:内置API已经帮你封装好了Promise
你手动写的这段代码:
var dopromise = new Promise (function(resolve,reject){ let isclean=true; if(isclean){ resolve('done'); } else { reject(); } }); dopromise.then(function(done){ console.log() }).catch(function(){ console.log() })
是手动构建Promise的过程:你把异步逻辑(这里是简单的判断isclean)塞进Promise构造函数的执行器里,自己控制什么时候触发resolve(成功)或reject(失败)。
而getUserMedia()这类浏览器内置API,本质是浏览器已经帮你把底层的异步操作封装成了Promise:
- 当你调用
getUserMedia({ video: true })时,浏览器会在后台执行一系列异步操作:弹出权限请求框、等待用户授权、获取设备的视频流。 - 这些操作完成后,浏览器内部会自动调用Promise的
resolve(比如用户授权成功,就把视频流stream传进去)或者reject(比如用户拒绝权限、没有可用摄像头)。 - 你要做的只是拿到这个现成的Promise实例,用
.then()处理成功结果,用.catch()捕获错误就行。
拆解你给出的那段代码逻辑
咱们来一步步看这段代码的执行流程:
navigator.mediaDevices.getUserMedia({ video: true }) .then(function(stream){ alice.addStream(stream); return alice.createOffer(); })
- 调用
getUserMedia({ video: true }),浏览器立刻返回一个Promise实例,同时后台开始异步处理媒体设备请求。 - 如果用户同意授权,这个Promise会进入**已兑现(fulfilled)**状态,把获取到的视频流
stream作为参数传给.then()的回调函数。 - 回调里先把
stream添加到alice(看起来是WebRTC的RTCPeerConnection实例),然后返回alice.createOffer()——这里是Promise链式调用的关键:.then()里返回另一个Promise时,后续的.then()会自动等待这个新Promise完成,不用嵌套回调。
补充个小细节:别忘处理失败场景
你这段代码没写.catch(),实际开发里一定要加上,用来处理用户拒绝权限、设备不可用等异常情况:
navigator.mediaDevices.getUserMedia({ video: true }) .then(function(stream){ alice.addStream(stream); return alice.createOffer(); }) .catch(function(err) { console.error('媒体流请求失败:', err); // 这里可以加友好的提示,比如"请允许摄像头权限以继续" });
总的来说,这种内置API返回Promise的用法,只是把你手动写的Promise构造逻辑封装到了浏览器底层,核心原理和你熟悉的手动创建Promise完全一致——都是用Promise来统一异步操作的处理方式,避免回调地狱。
内容的提问来源于stack exchange,提问作者ambach 66
相关产品推荐
相关产品推荐

