JavaScript|JavaScript Promise 的使用技巧
【JavaScript|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...)]
- 当 Promise 对象处于
pending
(工作)状态时,结果是未定义的。 - 当 Promise 对象
fulfilled
时,结果是一个值。如下图所示:
文章图片
- 当 Promise 对象被
rejected
时,结果是一个错误对象。
看一个包含 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 注册的回调函数。
推荐阅读
- 通过现实生活中一个例子来理解|通过现实生活中一个例子来理解 JavaScript Promise
- JavaScript|JavaScript 异步操作里的嵌套回调函数
- 什么是|什么是 JavaScript 里的异步操作和回调函数
- 【计算讲谈社】第八讲|AI 技术的“纺织业”是什么()
- python|victoriametrics的prometheus高可用性和容错策略长期存储
- 大数据运维监控|【大数据运维监控】Prometheus水平扩展Cortex的架构分析
- 但行好事,莫问前程。
- IBM携手中国银联,准备打造一个以区块链为基础的忠诚积分交易系统
- mybatis|mybatis 07: sql标签中 "#{}" 和 "${}" 的作用和比较
- 使用|使用 ABAP 编程语言的 System CALL 接口,直接执行 ABAP 服务器所在操作系统的 shell 命令