簡體   English   中英

如果第二個延遲函數在jQuery 1.8.x中被拒絕,我該如何鏈接兩個延遲函數並防止執行第三個函數?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM