我可以假设承诺中的错误会冒泡到新的Promise并抓住它吗?

时间:2016-02-11 17:16:18

标签: javascript node.js promise bluebird

我有一个函数,如果找到任何东西,它将查找缓存,否则它将继续获取数据并设置缓存。这是非常标准的。我想知道错误是否发生在最内部的功能上,它是否会保持泡沫到最外层的承诺?所以,我可以只有一个catch而不是一个 var _self = this; return new Promise(function(resolve, reject) { _self.get(url, redisClient).then(function getCacheFunc(cacheResponse) { if(cacheResponse) { return resolve(JSON.parse(cacheResponse)); } webCrawl(url).then(function webCrawl(crawlResults) { _self.set(url, JSON.stringify(crawlResults), redisClient); return resolve(crawlResults); }).catch(function catchFunc(error) { return reject(error); // can I delete this catch }); }).catch(function getCacheErrorFunc(cacheError) { return reject(cacheError); // and let this catch handle everything? }); });

这是我的代码。

我使用Bluebird

public static void main(String[] args) {
    List<Integer> l = new LinkedList<>();
    l.add(1);
    l.add(2);
    l.add(3);
    l.add(4);
    l.add(5);

    StringBuilder sb = new StringBuilder();

    for (Integer integer : l) {
        sb.append(integer);
    }
    System.out.println(Integer.parseInt(sb.toString()));
}

2 个答案:

答案 0 :(得分:3)

假设.get返回一个Promise,你会这样写:

 var _self = this;
 return _self.get(url, redisClient).then(function(cacheResponse) {
   if (cacheResponse) {
     return JSON.parse(cacheResponse);
   } else {
     return webCrawl(url).then(function(crawlResults) {
       _self.set(url, JSON.stringify(crawlResults), redisClient);
       return crawlResults;
     })
   }
 });

没有必要引入新的承诺,因为您已经从_self.get

获得了承诺

答案 1 :(得分:3)

是的,对于深层嵌套的Promises,可以有一个.catch(...)。诀窍:你可以用另一个Promise来解决Promise。这意味着您可以将代码重构为:

var _self = this;
_self.get(url, redisClient)
  .then(function(cacheResponse) {
    if(cacheResponse) {
      // Resolve the Promise with a value
      return JSON.parse(cacheResponse);
    }

    // Resolve the Promise with a Promise
    return webCrawl(url)
      .then(function(crawlResults) {
        _self.set(url, JSON.stringify(crawlResults), redisClient);

        // Resolve the Promise with a value
        return crawlResults;
      });
  })
  .catch(function(err) {
    console.log("Caught error: " + err);
  });

注意:我也删除了你最外面的Promise声明。由于_self.get(...)已经返回了Promise,因此不再需要这样做了。