Promise 实例的胜利和失败的回调的返回值,能够传递到外层的下一个 then。依照返回值类型能够分为以下几种:
a.promise 胜利和失败的回调的返回值 能够传递到外层的下一个 then
b. 返回值解决
- 如果返回的是一般值的话(传递到下一次的胜利中,不是谬误 不是 promise 就是一般值),
- 如果 throw 出错的状况(肯定会走到下一次的失败,这里的出错是指,抛出谬误,比方 new Erro)
- 如果返回 promise 的状况(会采纳 promise 的状态,决定走下一个 then 的胜利还是失败)
c. 错误处理 如果离本人最近的 then 没有错误处理(就是没有写谬误函数),会向下找
d. 每次执行完 Promise.then 办法后,返回的都是一个‘新的 promise’(promise 一旦胜利或者失败就不能批改状态)
阐明 name.txt 和 age.txt 文件都存在,name1.txt 文件不存在
let fs = require("fs");
function read(filename) {return new Promise((resolve, reject) => {fs.readFile(filename, "utf8", (err, data) => {if (err) return reject(err);
resolve(data);
});
});
}
1. 返回一般值(不是 throw Error, 不是 return promise 都属于返回的一般值), 传递到外层的下一个 then 的胜利中。
- 读取文件 name1.txt 失败时
read("./name1.txt").then((data) => {return 123;},
(err) => {return err;}
).then((data) => {console.log("---success--", data);
},
(err) => {console.log("---fail--", err, "谬误了!");
}
);
输入后果是
---success-- [Error: ENOENT: no such file or directory, open 'd:\myproject\node-s\name1.txt'] {
errno: -4058,
code: 'ENOENT',
syscall: 'open',
path: 'd:\\myproject\\node-s\\name1.txt'
}
- 读取文件 name.txt 胜利时候
read("./name.txt").then((data) => {return 123;},
(err) => {return err;}
).then((data) => {console.log("---success--", data);
},
(err) => {console.log("---fail--", err, "谬误了!");
}
);
输入后果 ---success-- 123
2.throw Error/throw new Error(),传递到外层的下一个 then 的失败中。
- 读取文件 name1.txt 失败时
read("./name1.txt").then((data) => {return 123;},
(err) => {throw err;}
).then((data) => {console.log("---success--", data);
},
(err) => {console.log("---fail--", err, "谬误了!");
}
);
输入后果
---fail-- [Error: ENOENT: no such file or directory, open 'd:\myproject\node-s\name1.txt'] {
errno: -4058,
code: 'ENOENT',
syscall: 'open',
path: 'd:\\myproject\\node-s\\name1.txt'
} 谬误了!
- 读取文件 name.txt 胜利时
read("./name.txt").then((data) => {throw Error( 123);
},
(err) => {throw err;}
).then((data) => {console.log("---success--", data);
},
(err) => {console.log("---fail--", err, "谬误了!");
}
);
输入后果
---fail-- Error: 123
at d:\myproject\node-s\2.promise\1.promise.js:32:13 谬误了!
3.return promise, 会采纳 return promise 的状态,决定走外层的下一个 then 的胜利还是失败
- 读取文件 name.txt 胜利,return promise 胜利态时
read("./name.txt").then((data) => {return read('./age.txt');
},
(err) => {throw err;}
).then((data) => {console.log("---success--", data);
},
(err) => {console.log("---fail--", err, "谬误了!");
}
);
输入后果:---success-- 88
- 读取文件 name.txt 胜利,return promise 失败态时
read("./name.txt").then((data) => {return read('./age1.txt');
},
(err) => {throw err;}
).then((data) => {console.log("---success--", data);
},
(err) => {console.log("---fail--", err, "谬误了!");
}
);
输入后果:
---fail-- [Error: ENOENT: no such file or directory, open 'd:\myproject\node-s\age1.txt'] {
errno: -4058,
code: 'ENOENT',
syscall: 'open',
path: 'd:\\myproject\\node-s\\age1.txt'
} 谬误了!
- 读取文件 name1.txt 失败时,如果有失败函数回调
read("./name1.txt").then((data) => {return read('./age1.txt');
},
(err) => {console.log(err);
// 默认 return undefined
}
).then((data) => {console.log("---success--", data);
},
(err) => {console.log("---fail--", err, "谬误了!");
}
);
输出后果:
[Error: ENOENT: no such file or directory, open 'd:\myproject\node-s\name1.txt'] {
errno: -4058,
code: 'ENOENT',
syscall: 'open',
path: 'd:\\myproject\\node-s\\name1.txt'
}
---success-- undefined
- 读取文件 name1.txt 失败时,以后 then 没有失败函数回调,会向下查找,下个 then 的失败回调函数。如果向下始终没有谬误回调函数则会报错~~~~
read("./name1.txt").then((data) => {return read('./age1.txt');
}).then((data) => {console.log("---success--", data);
},
(err) => {console.log("---fail--", err, "谬误了!");
}
);
输入后果:
---fail-- [Error: ENOENT: no such file or directory, open 'd:\myproject\node-s\name1.txt'] {
errno: -4058,
code: 'ENOENT',
syscall: 'open',
path: 'd:\\myproject\\node-s\\name1.txt'
} 谬误了!