我有一个函数可以返回deferred.promise
- jQuery的deferred
s变体 - 但是相同的概念。
文件读取是否成功,我想进入链的下一部分。如下所示:
var a,
b,
c;
readFile(fileNameA)
.then(
function (res) {
a = res; // res might be null
return readFile(fileNameB);
},
function (err) {
return readFile(fileNameB);
}
)
.then(
function (res) {
b = res; // res might be null
return readFile(fileNameC);
},
function (err) {
return readFile(fileNameC);
}
)
.then(
function (res) {
c = res; // res might be null
callPostLogic();
},
function (err) {
callPostLogic();
}
);
然而,对我来说,这似乎是不必要的代码重复。因为如果其中一个读取失败,我不想破坏链 - 所以在本地处理每个错误。
有没有办法解决这个问题,以使其更清洁并避免代码重复?我并不太关心每个readFile
电话的粒度。
我不喜欢在解析/拒绝的回调中重复代码调用。
答案 0 :(得分:3)
因为您使用的是jQuery Promises,所以您可以使用函数deferred.always
。如果成功或失败,它会被调用。它就像finally
- Block
try-catch
您可以轻松使用它:
$.get( "test.php" ).always(function() {
alert( "$.get completed with success or error callback arguments" );
});
因此,在您的情况下,您可以执行类似
的操作readFile(fileNameA)
.always(function() {
return readFile(fileNameB);
})
.always(function() {
return readFile(fileNamec);
})
.always(function() {
// finished
});
您可在此处找到文档:https://api.jquery.com/deferred.always/