对于异步执行的代码无法保证它的执行顺序,就需要用回调函数来解决,但是当层级过多时就会有多层嵌套产生回调地狱的问题。
使用promise(es6中api)来解决回调地狱的问题。
promise
1、promise本身不是异步任务但是内部往往封装一个异步任务。
2、resolve方法实际上就是then方法传递的那个function
const myFirstPromise = new Promise((resolve, reject) => {
// 做一些异步操作,最终会调用下面两者之一:
// resolve(someValue); // fulfilled
// 或
// reject("failure reason"); // rejected
});
// 想要某个函数拥有promise功能,只需让其返回一个promise即可。
function myAsyncFunction(url) {
return new Promise((resolve, reject) => {
const xhr = new XMLHttpRequest();
xhr.open("GET", url);
xhr.onload = () => resolve(xhr.responseText);
xhr.onerror = () => reject(xhr.statusText);
xhr.send();
});
};
then回调(第一个函数为成功的回调resolve, 第二个为失败的回调reject)
.then(function(data) {
console.log(data)
// 当return 123 后面的then接收到123
// 当return一个p2(p2 为promise)时后续的then方法的第一个参数会作为p2的 resolve
return 123
}, function (err) {
console.log('读取文件失败')
})
.then(function(data) {
console.log(data) //123
})
网友评论