在promise中调用一个函数

时间:2017-11-14 02:17:19

标签: javascript promise

我正在尝试找到一种方法在此承诺中调用方法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);
      })
  );

2 个答案:

答案 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