我正在尝试找到一种方法在此承诺中调用方法pageLoader.fetch两次。我已经尝试在新的承诺中将它分开,但是当我尝试获取变量links [0]时,我得到了未定义。怎么做?
pageLoader
.fetch(url)
.then(function(data) {
links = html.orderdList(data);
})
.then(function() {
return pageLoader.fetch(links[0]);
//links[0] is undefined in the next line!?
})
.then(
pageLoader
.fetch(links[0])
.then(function(innerLinks) {
calLinks = html.unorderList(innerLinks);
})
.then(function() {
return pageLoader.fetch("http:///example.com");
})
.catch(function(error) {
console.log(error);
})
);
答案 0 :(得分:1)
你几乎就在那里。您有一些冗余的then()
,我已将其删除。不清楚为什么要两次致电pageLoader.fetch(links[0])
。它会返回不同的结果吗?
您也看起来正在设置一些全局变量(例如links
& calLinks
),但不清楚您将如何异步访问它们。
这应该会好一点,但鉴于上述情况,它可能仍有问题:
pageLoader.fetch(url)
.then(function(data) {
links = html.orderdList(data); // <-- are these global or should you have a var?;
return pageLoader.fetch(links[0]);
})
.then(function(link) { // <-- did you want to do something with the return from above?
return pageLoader.fetch(links[0])
})
.then(function(innerLinks) {
calLinks = html.unorderList(innerLinks); // <-- are these global?;
return pageLoader.fetch("http:///example.com");
})
.catch(function(error) {
console.log(error);
})
答案 1 :(得分:1)
行.then(pageLoader.fetch(links[0])...)
没有做你想做的事情。像这样调用就相当于这样做:
var myCallback = pageLoader.fetch(links[0]).then().then().catch();
pageLoader
.fetch(url)
.then(function(data) {
links = html.orderdList(data);
})
.then(function() {
return pageLoader.fetch(links[0]);
})
.then(myCallback)
第二次获取实际上是在其他所有内容之前立即执行,并且结果正在作为回调传递。您可能希望在第一个fetch
发生之前不调用该代码,因此您需要将其包装在函数中(就像使用其他.then()
语句一样)。
我可能还建议您可以大大简化代码:
pageLoader
.fetch(url)
.then(function(data) {
// this is called when the first fetch() returns
links = html.orderdList(data);
return pageLoader.fetch(links[0]);
// returning a promise means that following .then()
// statements will act on the returned promise rather than the original
})
.then(function(innerLinks) {
// this is called when the second fetch() returns
calLinks = html.unorderList(innerLinks);
return pageLoader.fetch("http:///example.com");
})
.catch(function() {
// this is called if the original promise or any of
// the promises returned in the .then() callbacks throw errors
});
我发现这篇文章非常有助于解释使用Promise的最佳方法,以及可能发生的一些错误:https://pouchdb.com/2015/05/18/we-have-a-problem-with-promises.html