经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » JS/JS库/框架 » Omi » 查看文章
JavaScript中?Promise?的使用技巧
来源:jb51  时间:2022/8/15 16:59:11  对本文有异议

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

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

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

看一段最简单的代码:

  1. let myPromise = new Promise(function(myResolve, myReject) {
  2. // "Producing Code" (May take some time)
  3.  
  4. myResolve(); // when successful
  5. myReject(); // when error
  6. });
  7.  
  8. // "Consuming Code" (Must wait for a fulfilled Promise)
  9. myPromise.then(
  10. function(value) { /* code if successful */ },
  11. function(error) { /* code if some error */ }
  12. );

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

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

然后 then 指定的回调函数被异步调用,注意 Chrome 里的提示:

  • 当 Promise 对象处于 pending(工作)状态时,结果是未定义的。
  • 当 Promise 对象 fulfilled 时,结果是一个值。如下图所示:

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

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

看一个包含 UI 的例子:

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

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

运行显示:

3 秒后:

一个文件访问的例子:

  1. let myPromise = new Promise(function(myResolve, myReject) {
  2. let req = new XMLHttpRequest();
  3. req.open('GET', "mycar.htm");
  4. req.onload = function() {
  5. if (req.status == 200) {
  6. myResolve(req.response);
  7. } else {
  8. myReject("File not Found");
  9. }
  10. };
  11. req.send();
  12. });
  13.  
  14. myPromise.then(
  15. function(value) {myDisplayer(value);},
  16. function(error) {myDisplayer(error);}
  17. );

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

到此这篇关于JavaScript  Promise 的使用技巧的文章就介绍到这了,更多相关JavaScript Promise 内容请搜索w3xue以前的文章或继续浏览下面的相关文章希望大家以后多多支持w3xue!

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号