//pro1 中return一个Promise对象
function pro1(){
return new Promise((resolve,reject)=>{
setTimeout(()=>{console.log(1000);resolve();},1000);
})
}
//pro2 中return一个Promise对象
function pro2(){
return new Promise((resolve,reject)=>{
setTimeout(()=>{console.log(5000);resolve();},5000);
});
}
//pro3 中return一个Promise对象
function pro3(){
return new Promise((resolve,reject)=>{
setTimeout(()=>{console.log(500);resolve();},500);
})
}
pro1().then(pro2).then(pro3).then(()=>{console.log('ok')}); //这种执行方式总感觉有问题
应该用一下方式才对
//pro1 中return一个Promise对象
function pro1() {
return new Promise((resolve, reject) => {
setTimeout(() => { console.log('---pro1---'); resolve('data1'); }, 300);
})
}
//pro2 中return一个Promise对象
function pro2() {
return new Promise((resolve, reject) => {
setTimeout(() => { console.log('---pro2---'); resolve('data2'); }, 200);
});
}
//pro3 中return一个Promise对象
function pro3() {
return new Promise((resolve, reject) => {
setTimeout(() => { console.log('---pro3---'); resolve('data3'); }, 100);
})
}
// pro1().then(pro2()).then(pro3()).then(() => { console.log('ok') });
//结果:
// ---pro3---
// ---pro2---
// ---pro1---
// ok
//应该用这种执行方式
pro1().then(data => {
console.log('1:',data);
pro2().then(data => {
console.log('2:', data);
pro3().then(data => { console.log('3:', data) });
})
})
http://liubin.org/promises-book 这里说的很详细 有空看看
另外一种形式
let p2 = new Promise((resolve, reject) => {
setTimeout(() => {
console.log('---p2---');
resolve('p2 return data');
}, 300);
});
//pro1 中return一个Promise对象
function pro1() {
return new Promise((resolve, reject) => {
setTimeout(() => {
console.log('---pro1---');
resolve(p2); //返回p2的return
}, 100);
})
}
pro1().then(
data => { // data = p2的返回
console.log(data);
})
----------------
方法链:
function taskA() {
console.log("Task A");
throw new Error("throw Error @ Task A")
}
function taskB() {
console.log("Task B");// 不会被调用
}
function onRejected(error) {
console.log(error);// => "throw Error @ Task A"
}
function finalTask() {
console.log("Final Task");
}
var promise = Promise.resolve();
promise
.then(taskA)
.then(taskB) //如果taskA不出异常,则执行这行, 出异常执行下一行
.catch(onRejected)
.then(finalTask);
//结果:
Task A
Error: throw Error @ Task A
Final Task
前面例子中的Task都是相互独立的,只是被简单调用而已。
这时候如果 Task A 想给 Task B 传递一个参数该怎么办呢?
答案非常简单,那就是在 Task A 中 return
的返回值,会在 Task B 执行时传给它。