diff --git "a/34\351\231\210\346\264\213/\347\254\224\350\256\260/1201promise.md" "b/34\351\231\210\346\264\213/\347\254\224\350\256\260/1201promise.md" new file mode 100644 index 0000000000000000000000000000000000000000..83abf2fcc2c72cd2fedf9cabc781bb4b3100dd57 --- /dev/null +++ "b/34\351\231\210\346\264\213/\347\254\224\350\256\260/1201promise.md" @@ -0,0 +1,97 @@ +**一 promise是什么,解决什么问题** + +Promise是一种异步编程的解决方案。 + +简单来说,Promise是一个容器,里卖弄包含着一个异步操作的结果 + +从语法上来说,promise(小写的p)是一个对象,从它 + +可以获取异步操作的最终状态 + +而promise是一个==构造函数==, + +自己身上由reject resolve all方法,原型上由then catach方法 + +Promise有三种状态,**pending 初始态**,**fulfilled 成功状态**,**rejected失败状态**,只有异步操作的结果可以决定当前是哪一种状态,其他任何操作都无法改变这个状态。 + +Promise的状态一旦改变,就不会再变,任何时候都可以得到这个结果,状态不可以逆,只能由 pending变成fulfilled或者由pending变成rejected + + +首先来了解一下回调函数 + +```JavaScript +/* + 回调函数callback + +什么是回调函数 + =>定义:把 A函数当作参数传递到 B函数内部,在 B函数内部以形参的方式调用 A函数 + =>这种函数的调用方式,我们叫做回调函数(ca11back) +*/ +function A(cb) { + console.log('a') + cb(new Date()) +} + +function B(cb) { + console.log('b') + cb(function (res) { + console.log(res) + }) +} + +B(A) + +``` + + + + **Promise主要解决的问题** + +- 回调地狱:第一个回调的结果,被内层的第二个回调所需要 +- promise可以支持多个并发的请求,获取并发请求中的数据 +- 这个promise可以解决异步的问题,本身不能说promise是异步的 + + + +### 二. Promise基础语法 + +/* + Promise的语法 + + ```JavaScript + + Promise 是 ES6 内置的构造函数 + + 语法:new Promise(function(){你要执行的异步的事情 }) + => 实例化的时候,这个函数接收两个参数 + => resolve,reject + + 语法: + =>实例化对象身上由两个方法 + 1. then() + -> promise对象.then(function(){}) + 2. catch() + -> promise对象.catch(function(){}) + => then方法的函数传递给了实例化的 resolve + => catch方法的函数传递给了实例化的 reject + */ + + const p = new Promise(function (resolve, reject) { + // resolve是成功的回调函数 当你书写resolve()的时候,实际上是在调用then里面的函数 + // reject是失败的回调函数 当你书写reject()的时候,实际上是在调用catch里面的函数 + ajax({ + url: './server/a.php', + dataType: 'json', + success(res) { + resolve(res) + }, + error(err) { + reject(err) + } + }) + }) + + // 在 new Promise里面做一些回调的事情 + // 将回调的结果转移到外面 then catch中 + // 在 promise中做一件异步的事情,把结果放在外部的函数中去执行 + p.then(function (res) { console.log('我执行了', res) }) + p.catch(function (err) { console.log('我失败了', err) }) + + ``` + +