为了帮助这篇文章的未来观众,我创建了这个pluma答案的演示.
我的目标似乎相当简单.
step(1)
.then(function() {
return step(2);
}, function() {
stepError(1);
return $q.reject();
})
.then(function() {
}, function() {
stepError(2);
});
function step(n) {
var deferred = $q.defer();
//fail on step 1
(n === 1) ? deferred.reject() : deferred.resolve();
return deferred.promise;
}
function stepError(n) {
console.log(n);
}
Run Code Online (Sandbox Code Playgroud)
这里的问题是,如果我在第1步失败,两个stepError(1)AND都会stepError(2)被解雇.如果我不return $q.reject那么stepError(2)就不会被解雇,但step(2)会,我明白了.除了我想做的事以外,我已经完成了所有的事情.
如何编写promises以便我可以在拒绝时调用函数,而无需调用错误链中的所有函数?或者还有另一种方法来实现这一目标吗?
这是一个现场演示,所以你有一些工作.
我有点解决了.在这里,我在链的末尾捕获错误并传递数据,reject(data)以便我知道错误函数中要处理的问题.这实际上不符合我的要求,因为我不想依赖于数据.它会很蹩脚,但在我的情况下,将错误回调传递给函数会更加清晰,而不是依赖于返回的数据来确定要做什么.
step(1)
.then(function() {
return step(2);
})
.then(function() …Run Code Online (Sandbox Code Playgroud) 在我的代码中,基于特定条件,我想跳到done函数,而不管所有then函数.
该问题的原始版本在编辑中.以下是我正在处理的实际问题.抱歉给你带来不便
实际问题:
我正在读取文件并进行处理.如果文件的内容符合某些条件,我必须对文件系统进行一系列操作(比如读写几个文件),然后执行done函数.如果条件失败,我必须跳过所有系列操作,我必须done直接执行该功能.
我result在所有then函数中返回一个对象(比如说),然后then我更新result并返回它.所以,当所有的then事情都完成后,done就会有所累积result.最后,done将处理result并打印它.
因此,如果最初不满足条件,done则只需打印result(这将是空的).
Q()
.then(readFile)
.then(function (contents) {
var processResult = process the contents;
if (processResult) {
return {};
} else {
// How can I skip to `done` from here
}
})
.then(function (results) {
// do some more processing and update results
return …Run Code Online (Sandbox Code Playgroud) 我是这样的承诺,
function getMode(){
var deferred = Promise.defer();
checkIf('A')
.then(function(bool){
if(bool){
deferred.resolve('A');
}else{
return checkIf('B');
}
}).then(function(bool){
if(bool){
deferred.resolve('B');
}else{
return checkIf('C');
}
}).then(function(bool){
if(bool){
deferred.resolve('C');
}else{
deferred.reject();
}
});
return deferred.promise;
}
Run Code Online (Sandbox Code Playgroud)
checkIf返回一个promise,是的checkIf ,无法修改.
我如何在第一场比赛中脱颖而出?(除了明确抛出错误之外的任何其他方式?)