我有一个函数,如果找到任何东西,它将查找缓存,否则它将继续获取数据并设置缓存。这是非常标准的。我想知道错误是否发生在最内部的功能上,它是否会保持泡沫到最外层的承诺?所以,我可以只有一个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()));
}
答案 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,因此不再需要这样做了。