如何拒绝来自_.each循环的承诺,它永远不会到达document.write('Failed');
。在lodash中是否有更好的功能来处理这种情况。
function check(){
return Promise
.all(
[
Promise.resolve([1,3,4]),
Promise.resolve([0,4,3]),
Promise.resolve(undefined)
]).then(function(results){
return _.each(results, function(result){
return _.each(result, function(value) {
// should reject when value is 0
if(!value){
return Promise.reject();
}
});
});
});
}
check().then(function(){
document.write('All Success');
}, function(){
// Never reaching this code.. :(
document.write('Failed');
});
答案 0 :(得分:2)
根据documentation,_.each()
函数返回第一个参数中的列表,并且不能被删除。
要实现您的目标,请尝试使用here所记录的for...of
循环:
function check(){
return Promise
.all(
[
Promise.resolve([1,3,4]),
Promise.resolve([0,4,3]),
Promise.resolve(undefined)
]).then(function(results){
for (let result of results) {
for (let value of result) {
// should reject when value is 0
if(!value){
return Promise.reject();
}
});
});
});
}
check().then(function(){
document.write('All Success');
}, function(){
// Never reaching this code.. :(
document.write('Failed');
});
如果您坚持使用_.each()
循环,那么当它遇到第一次拒绝时,您永远无法摆脱循环,所以我不推荐这种方法。但是,您可以在最初包含已解析的promise的第一个循环之前声明一个变量,如果!value
检查通过,则将其替换为被拒绝的promise,然后在最后一个循环结束后返回此变量{{ 1}}。
答案 1 :(得分:2)
您可以再次使用Promise.all
,再加上flatten
和map
function check(){
return Promise
.all(
[
Promise.resolve([1,3,4]),
Promise.resolve([0,4,3]),
Promise.resolve(undefined)
]).then(function(results){
return Promise.all(_(results).flatten().map(result => {
if(result === 0) return Promise.reject()
}))
});
}
check().then(function(){
document.write('All Success');
//lert("all success");
}, function(){
document.write('Failed');
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.16.2/lodash.js"></script>
您也可以使用some
function(results){
return Promise.all(results.map(result => {
if([].concat(result).some(value => value === 0)) {
return Promise.reject()
}
}
答案 2 :(得分:2)
没有理由在then
回调中创建新的承诺并将其返回。承诺的重点是允许您以更加同步的方式编写异步代码。办法。您在then
回调中想要做的是抛出错误:
function check(){
return Promise
.all(
[
Promise.resolve([1,3,4]),
Promise.resolve([0,4,3]),
Promise.resolve(undefined)
]).then(function(results){
return _.each(results, function(result){
return _.each(result, function(value) {
// should reject when value is 0
if(!value){
throw new Error();
}
});
});
});
}
check().then(function(){
document.write('All Success');
}, function(){
// Never reaching this code.. :(
document.write('Failed');
});
这将导致承诺链中的拒绝。