“生产代码”是可能需要一些时间才能执行的代码。“消费代码”是必须等待结果的代码。Promise是一个JavaScript对象,它链接生产代码和消费代码。看最简单的代码:letmyPromise=newPromise(function(myResolve,myReject){//"ProducingCode"(Maytakesometime)myResolve();//成功时myReject();//错误时});//“消费代码”(必须等待一个已完成的Promise)myPromise.then(function(value){/*codeifsuccessful*/},function(error){/*codeifsomeerror*/});执行完newPromise的构造函数后,会立即进入Promise的构造函数体,即包含resolve和reject方法的匿名函数。然后执行它。这个时候then中的回调函数是不会执行的。然后异步调用then指定的回调函数,注意chrome中的提示:【外链图片传输失败,源站可能有防盗链机制,建议保存图片直接上传(img-gClCUMmg-1660268588108)(https://upload-images.jianshu...)]当Promise对象处于pending(工作)状态时,结果是undefined。当Promise对象被实现时,结果是一个值。如下图所示:当Promise对象被拒绝时,结果是一个错误对象。开发人员无权访问Promise属性状态和结果,必须使用Promise方法来处理Promise。请参阅包含UI的示例。Promises封装了异步代码。上图中的setTimeout模拟了一次HTTP操作,耗时3秒。返回的myPromise对象,使用then注册回调函数。回调函数不关心它何时被调用。运行显示:3秒后:文件访问示例:letmyPromise=newPromise(function(myResolve,myReject){letreq=newXMLHttpRequest();req.open('GET',"mycar.htm");req.onload=function(){if(req.status==200){myResolve(req.response);}else{myReject("FilenotFound");}};req.send();});myPromise.然后(函数(值){myDisplayer(值);},函数(错误){myDisplayer(错误);});函数体一般是一个耗时操作,操作本身会立即执行,但是什么时候执行结束呢?这是一个异步操作。执行完之后通过resolve通知then注册的回调函数。
