- Promise是一个构造函数,可以new Promise()得到一个Promise实例;
- 在Promise上,有两个函数,分别叫做resolve(成功之后的回调函数)和reject(失败之后的回调函数);
- 在Promise构造函数的Prototype属性上,有一个.then()方法,也就是说,只要是Promise构造函数创建的实例,都可以访问到.then()方法;
- Promise表示一个异步操作,每当new一个Promise的实例,这个实例就表示一个具体的异步操作;
- Promise创建的实例是一个异步操作,这个异步操作的结果,只能有两种状态:
5.1 状态1:异步执行成功了,需要在内部调用成功的回调函数resolve把结果返回给调用者;
5.2 状态2:异步执行失败了,需要在内部调用失败的回调函数reject把结果返回给调用者;
5.3 由于Promise的实例是一个异步操作,所以内部拿到操作的结果后,无法使用return把操作的结果返回给调用者;这时候,只能使用回调函数的形式,来把成功或失败的结果返回给调用者; - 可以在new出来的Promise实例上,调用.then()方法,【预先】为这个Promise异步操作,指定成功(resolve)和失败(reject)回调函数;
注意:这里new出来的promise只是代表【形式上】的一个异步操作;
什么是形式上的异步操作:就是说我们只知道它是一个异步操作,但是做什么具体的异步事情,目前还不清楚。
var promise = new Promise()
这是一个具体的异步操作:其中使用function指定一个具体的异步操作
var promise = new Promise(function(){
//这个function内部写的就是具体的异步操作
})
实例:读取文件的操作
files文件夹中有三个txt文件:1.txt(内容随便写:111)、2.txt(222)、3.txt(333)
以下代码是在xxx.js中
const fs=require('fs')
//每当new一个Promise实例的时候,就会立即执行这个异步操作中的代码
//也就是说,new的时候除了能够得到一个promise实例之外,还会立即调用我们为Promise构造函数传递那个function,执行这个function中的异步操作代码
var promise=new Promise(function(){
fs.readFile('./file/2.txt','utf-8',(err,dataStr)=>{
if(err) throw err
console.log(dataStr) //终端返回结果222
})
})
在终端中运行xxx.js :node ./xxx.js
改进代码1:
function getFileByPath(fpath) {
var promise = new Promise(function() {
fs.readFile(fpath, 'utf-8', (err, dataStr) => {
if (err) throw err
console.log(dataStr) //终端返回结果222
})
})
}
getFileByPath('./file/2.txt')
异步:操作之间没有联系,同时进行多个操作;代码更复杂
同步:同时只能做一件事;代码简单。
使用Promise的好处:使用Promise解决回调地狱问题(resolve、reject、.then),即消除异步操作(相当于用同步一样的方式,来书写异步代码)。
Promise的用法:
①Promise.all([
.
a
j
a
x
(
)
,
.ajax(),
.ajax(),.ajax(),$.ajax()]).then(success=>{},err=>{})
all一个个的,一个都不能少,与的关系
/* let p1 = new Promise(function(resolve, reject) {
// 异步代码
// resolve成功了,reject失败了
$.ajax({
//arr.txt的内容:[98,7,4,86,5,16,7,4,9,85,46]
url: 'arr.txt',
dataType: 'json',
success(arr) {
resolve(arr)
},
error(err) {
reject(arr)
}
})
})
let p2 = new Promise(function(resolve, reject) {
$.ajax({
//json.txt的内容:{"a":1,"b":"hr226","c":3}
url: 'json.txt',
dataType: 'json',
success(arr) {
resolve(arr)
},
error(err) {
reject(arr)
}
})
}) */
/* function createPromise(url) {
return new Promise(function(resolve, reject) {
// 注意:$.ajax返回的对象其实就是一个Promise
$.ajax({
// url: url,
url,
dataType: 'json',
success(arr) {
resolve(arr)
},
error(err) {
reject(arr)
}
})
})
} */
/* p1.then(function(arr) {
alert('ok' + arr)
}, function(err) {
alert('no' + err)
}) */
Promise.all([
// p1, p2
/* createPromise('arr.txt'),
createPromise('json.txt') */
$.ajax({
url: 'arr.txt',
dataType: 'json'
}),
$.ajax({
url: 'json.txt',
dataType: 'json'
}),
]).then(arr => {
let [res1, res2] = arr;
console.log(res1, res2)
}, err => {
alert('all no' + err)
})
/* .then(function(arr) {
// 解构赋值
let [res1, res2] = arr;
// alert('all ok');
// alert(res1);
// alert(JSON.stringify(res2))
console.log(res1, res2)
}, function(err) {
alert('all no'+err)
}) */
②Promise.race先来先服务、竞速