在 JavaScript 的世界中, 所有代码都是单线程执行的.
由于这个 "缺陷", 导致 JavaScript 的所有网络操作, 浏览器事件, 都必须是异步执行.
通常我们用得较多的是 setTimeout 来做一个回调, 但本文说得是 Promise 这个高大尚的 es6 新对象,
所谓 Promise, 简单说就是一个容器, 里面保存着某个未来才会结束的事件 (通常是一个异步操作) 的结果. 从语法上说, Promise 是一个对象, 从它可以获取异步操作的消息. Promise 提供统一的 API, 各种异步操作都可以用同样的方法进行处理. 简单的说它的回调函数会在整个 html 执行结束后它再执行.
- <script>
- console.log('我是顺序运行的 1 号');
- // 回调测试 1, 带 promise 实例化时的参数
- function test1(value){
- console.log('回调测试 1')
- return value
- }
- // 回调测试 2, 不带 promise 实例化时的参数
- function test2(){
- console.log('回调测试 2')
- return arguments[0]
- }
- // 创造了一个 Promise 实例
- let p = new Promise(function (resolve, reject) {
- console.log('创造了一个 Promise 实例');
- // 异步操作成功时调用, 并将异步操作的结果, 作为参数传递出去
- resolve(666);
- });
- console.log('我是顺序运行的 2 号');
- // 方法一: 最简便的, 拿到的是创造 Promise 实例时给 resolve 的参数
- p.then(function(result) {
- // success
- console.log('方法一回调成功结果是:'+result)
- }, function(error) {
- // failure
- console.log('failure1:'+error)
- });
- // 方法二: 先执行指定的函数再回调, test1 这时就是 resovle, 所以参数是 666
- p.then(test1)
- .then(function (result) {
- console.log('方法二回调成功结果是:' + result);
- }, function(error) {
- // failure
- console.log('failure2:'+error)
- });
- // 方法三: 先执行指定的函数再回调, test1 这时就是 resovle, 所以默认参数是 arguments 里面也有 666
- p.then(test2)
- .then(function (result) {
- console.log('方法三回调成功结果是:' + result);
- }, function(error) {
- // failure
- console.log('failure3:'+error)
- });
- console.log('我是顺序运行的 3 号');
- </script>
来源: https://blog.csdn.net/a419419/article/details/79494352