[英]How do I chain of 2 deferred functions and prevent third function from being executed if second is rejected in jQuery 1.8.x?
賦予2個延遲功能
function func1() {
var dfd = $.Deferred();
setTimeout(function() {
dfd.resolve('Password');
}, 1000);
return dfd.promise();
}
function func2(id) {
var dfd = $.Deferred();
if (id == 0) {
dfd.reject();
}
else {
dfd.resolve();
}
return dfd.promise();
}
function func3()
{
alert('Hello World')
}
如果func2被拒絕,我不想執行func3。
我試過了
func1().then(func2(1)).then(func3())
和
func1().then(func2(1)).done(func3())
func3()似乎總是被執行。
func1().then(func2(1)).then(func3())
應該:
func1().then(function () {func2(1)}).then(func3)
實際上應該是:
func1().then(() => func2(1)).then(func3)
當您向函數發送參數時,該函數將執行(即使在()
情況下也是如此()
。因此,我們需要做的就是防止這種情況。由於func3
接受任何參數,因此我們可以將其原樣傳遞給函數, no ()
,但是由於我們希望func2
具有參數,因此我們在其周圍定義了一個函數,因此,您可以通過function
或通過箭頭函數=>
。
這是檢查故障的方法。
func1().then(() => func2(0)).fail(() => alert("oh no")).then(func3);
確保不要調用傳遞給then
的函數。 jQuery延遲實現需要調用它們,而不是您,因此您需要傳遞函數,而不是函數調用。
其次,如果需要傳遞一個參數,則可以使用.bind
,它從現有函數創建一個新函數,但是它將傳遞您在調用函數時指定的參數:
func1().then(func2.bind(null, 1)).then(func3)
.fail(function () { console.log('failed') });
傳遞給then
的第一個參數僅在promise被解決時調用,而不是在被拒絕時調用。 因此,一旦鏈中有被拒絕的承諾,將不執行任何鏈式then
回調(第一個參數)的操作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.