写点什么

JavaScript Promise 的使用技巧

作者:Jerry Wang
  • 2022 年 8 月 12 日
    上海
  • 本文字数:968 字

    阅读完需:约 3 分钟

JavaScript Promise 的使用技巧

“生产代码”是可能需要一些时间来执行的代码。


“消费代码”是必须等待结果的代码。


Promise 是一个 JavaScript 对象,它链接生产代码和消费代码。


看一段最简单的代码:


let myPromise = new Promise(function(myResolve, myReject) {// "Producing Code" (May take some time)
myResolve(); // when successful myReject(); // when error});
// "Consuming Code" (Must wait for a fulfilled Promise)myPromise.then( function(value) { /* code if successful */ }, function(error) { /* code if some error */ });
复制代码


执行 new Promise 的构造函数后,会立即进入 Promise 的构造函数体内,即包含了 resolve 和 reject 方法的匿名函数。



然后执行完毕。此时并不会执行 then 里的回调函数。



然后 then 指定的回调函数被异步调用,注意 Chrome 里的提示:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gClCUMmg-1660268588108)(https://upload-images.jianshu.io/upload_images/2085791-ceaee127517ade97.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)]


  • 当 Promise 对象处于 pending(工作)状态时,结果是未定义的。

  • 当 Promise 对象 fulfilled 时,结果是一个值。如下图所示:



  • 当 Promise 对象被 rejected 时,结果是一个错误对象。


开发人员无法访问 Promise 属性状态和结果,必须使用 Promise 方法来处理 Promise。


看一个包含 UI 的例子。



Promise 把异步代码封装起来。上图的 setTimeout,模拟了一个耗时 3 秒的 HTTP 操作。


返回的 myPromise 对象,使用 then 注册回调函数。回调函数不关心自己什么时候被调用。


运行显示:



3 秒后:



一个文件访问的例子:


let myPromise = new Promise(function(myResolve, myReject) {  let req = new XMLHttpRequest();  req.open('GET', "mycar.htm");  req.onload = function() {    if (req.status == 200) {      myResolve(req.response);    } else {      myReject("File not Found");    }  };  req.send();});
myPromise.then( function(value) {myDisplayer(value);}, function(error) {myDisplayer(error);});
复制代码


函数体内一般是一个比较费时的操作,操作本身会立即执行,但什么时候执行结束?这就是一个异步操作了。执行结束后,通过 resolve 通知 then 注册的回调函数。

发布于: 刚刚阅读数: 3
用户头像

Jerry Wang

关注

🏆InfoQ写作平台-签约作者🏆 2017.12.03 加入

SAP成都研究院开发专家,SAP社区导师,SAP中国技术大使。2007 年从电子科技大学计算机专业硕士毕业后加入 SAP 成都研究院工作至今。工作中使用 ABAP, Java, JavaScript 和 TypeScript 进行开发。

评论

发布
暂无评论
JavaScript Promise 的使用技巧_JavaScript_Jerry Wang_InfoQ写作社区