promise

callback hell-回调地狱

promise优化回调地狱_vue.js

var fs = require('fs')
fs.readFile('./data/a.text','uft8',function(err,data){
if(err){
throw err
}
console.log(data);
})
fs.readFile('./data/b.text','uft8',function(err,data){
if(err){
throw err
}
console.log(data);
})
fs.readFile('./data/c.text','uft8',function(err,data){
if(err){
throw err
}
console.log(data);
})


无法保证代码顺序,不一定谁前谁后


通过回调嵌套的方式来保证顺序

var fs = require('fs')
fs.readFile('./data/a.text','uft8',function(err,data){
if(err){
throw err
}
console.log(data);
fs.readFile('./data/b.text','uft8',function(err,data){
if(err){
throw err
}
console.log(data);
fs.readFile('./data/c.text','uft8',function(err,data){
if(err){
throw err
}
console.log(data);
})
})
})

当嵌套过深,难以维护
为了解决以上编码方式解决的问题所以​​​es6​​中新增了一个API

promise

承诺本事不是异步的,内容(任务)是异步的
基本语法

// 创建一个容器
// 1、给别人一个承诺
var p1 = new Promise(function (resolve,) {
fs.readFile('./data/a.text', 'utf8', function (err,data) {
if (err) {
// 状态的改变
reject(err)
} else {
// 成功
resolve(data)
}
})
})
// p1就是承诺
// then方法接受的funtion就是容器中的resolve
p1
.then(function(data){
console.log(data);
},function(err){
console.log('读取失败');
})

实例

var fs = require('fs')
var p1 = new Promise(function (resolve,) {
fs.readFile('./a.text', 'utf8', function (err,) {
if (err) {
// 状态的改变
reject(err)
} else {
// 成功
resolve(data)
}
})
})

var p2 = new Promise(function (resolve,) {
fs.readFile('./b.text', 'utf8', function (err,) {
if (err) {
// 状态的改变
reject(err)
} else {
// 成功
resolve(data)
}
})
})

var p3 = new Promise(function (resolve,) {
fs.readFile('./c.text', 'utf8', function (err,) {
if (err) {
// 状态的改变
reject(err)
} else {
// 成功
resolve(data)
}
})
})
p1
.then(function (data) {
console.log(data);
// 返回对象
return p2;
}, function (err) {
console.log('读取失败');
})
.then(function (data) {//这里就就收了p2的resolve函数
console.log(data);
return p3;
})
.then(function (data) {//这里就就收了p3的resolve函数
console.log(data);
})