functiongetTextURL(dom, className, urlText) { for (let el of dom.getElementsByClassName(className)[0].getElementsByTagName("a")) { if (el.innerText.includes(urlText)) { return el.getAttribute("href"); break; } } returnnull; }
有了这个函数就看看promise对象如何把嵌套回调改造成顺序调用的。
代码里有重要注释
// 返回小说的数据 在main函数里调用 functionnovel() { let url = getTextURL(document, "ablum_read", "正序"); if (url === null) { alert("获取章节列表失败"); } // 请注意download函数后面的then调用 download(url) .then((doc) => { let dom = document.createElement("div"); dom.innerHTML = doc; let url = getTextURL(dom, "page", "下一页"); alert(url); // 我们看download函数返回了一个promise对象而then就是它的一个方法, 所以如下我们在返回一个promise对象, 继续调用then方法 returndownload(url); }) .then((doc) => { let dom = document.createElement("div"); dom.innerHTML = doc; let url = getTextURL(dom, "page", "下一页"); alert(url); returndownload(url); }) .then((doc) => { let dom = document.createElement("div"); dom.innerHTML = doc; let url = getTextURL(dom, "page", "下一页"); alert(url); returndownload(url); }) // 最后调用catch方法, 从名称中我们可以看出这是错误处理方法, 可以给他一个不存在的url看看运行结果比如/123 .catch(alert); }