2013-10-10 36 views
0
var $jobApplication = $.Deferred(); 
$jobApplication 
    .progress(displayState) 
    .done(acceptContract) 
    .done(relocate) 
    .fail(keepCalmAndDrinkWine); 

function displayState(payload){ 
    console.log(payload.state); 

    if (payload.job){ 
    $jobApplication.resolve(payload.job); 
    } 
} 

$jobApplication.notify({ 
    state: "shortlist" 
}); 

$jobApplication.notify({ 
    state: "phone_interview", 
    date: "2013-01-23" 
}); 

$jobApplication.notify({ 
    state: "technical_interview", 
    date: "2013-02-11" 
}); 

$jobApplication.notify({ 
    state: "physical_interview", 
    date: "2013-02-14" 
}); 

$jobApplication.notify({ 
    state: "salary_negociation", 
    job: { 
    role: "Software Engineer", 
    company: "BBC", 
    starts: "2013-03-04" 
    }, 
    date: "2013-02-14" 
}); 


function acceptContract(jobOffer){ 
    console.log("Contract accepted with the following details: "); 
    console.log(jobOffer); 
} 

function keepCalmAndDrinkWine(err){ 
    console.log("Too bad it did not work for this reason: %s ", err); 
} 

function relocate(){ 
    console.log("Relocating (a new Promise ;-)) "); 
} 

這是我的例子來描述一些問題,我有一些麻煩。JQuery推遲 - 添加回調後定義的鏈接

我想添加一些回調到「acceptContract」函數。當「acceptContract」運行時,我的新回調會立即運行。

舉例來說,我的第一個解決方案是添加這些代碼。

acceptContract = $jobApplication.promise(); 

acceptContract.done(function() { 
    console.log('call your mom') 
}).done(function() { 
    console.log('be happy') 
}) 

此代碼工作,但一個小故障。鏈完成後工作。

控制檯:

這是我得到:

phone_interview 
technical_interview 
physical_interview 
salary_negociation 
Contract accepted with the following details: 
Object {role: "Software Engineer", company: "BBC", starts: "2013-03-04"} 
Relocating (a new Promise ;-)) 
call your mom 
be happy 

這是我想到:

phone_interview 
technical_interview 
physical_interview 
salary_negociation 
Contract accepted with the following details: 
Object {role: "Software Engineer", company: "BBC", starts: "2013-03-04"} 
call your mom 
be happy 
Relocating (a new Promise ;-)) 
+0

有什麼問題? – robbrit

+0

要清楚,你預期會發生什麼?什麼是*「毛刺」*?這將是一個邏輯錯誤,如果我們不知道你的預期邏輯是什麼,那麼我們所能說的就是按預期工作。 –

+0

我希望在 「合同被接受並具有以下詳細信息後執行回調後發生我: 對象{角色:」軟件工程師「,公司:」BBC「,起始:」2013-03-04「}」 這條線。 – Samed

回答

0

你有種濫用的承諾的模式。兩點:

  • 承諾的回調不應該影響它的狀態。您正在從進度監聽器中解析它,而是通知延遲的進程應該觸發進度事件並解決自身的承諾。
  • 回調的順序被定義爲FAFC(首先附加 - 首先被調用),但是更顯着的是回調必須(應該)不相互依賴。這是擊敗純粹的設計,並使代碼不那麼幹淨。相反,如果你希望一個動作發生在另一個動作之後,你應該用then來鏈接它們,爲「第一個承諾後執行的動作」創建一個新的承諾,然後你可以爲第二個動作附加監聽器。通常這意味着新的承諾將以第二個行動所需的第一個行動的結果來解決,在您的情況下您只需要沒有價值的時間鏈接。

function applyForJob() { 
    var application = $.Deferred(); 
    return { 
     step: function(payload) { 
      application.notify(payload.state); 
      if (payload.job) 
       application.resolve(payload.job); 
     }, 
     promise: application.promise() 
    }; 
} 

var $jobApplication = applyForJob(); 
$jobApplication.promise 
    .progress(console.log.bind(console)) 
    .fail(keepCalmAndDrinkWine); 

var acceptedContract = $jobApplication.promise 
    .then(acceptContract) 
    .then(function() { 
     console.log('call your mom'); 
     console.log('be happy'); 
    }); 
acceptedContract.done(relocate); 

$jobApplication.step({ 
    state: "shortlist" 
}); 

$jobApplication.step({ 
    state: "phone_interview", 
    date: "2013-01-23" 
}); 

$jobApplication.step({ 
    state: "technical_interview", 
    date: "2013-02-11" 
}); 

$jobApplication.step({ 
    state: "physical_interview", 
    date: "2013-02-14" 
}); 

$jobApplication.step({ 
    state: "salary_negociation", 
    job: { 
    role: "Software Engineer", 
    company: "BBC", 
    starts: "2013-03-04" 
    }, 
    date: "2013-02-14" 
}); 


function acceptContract(jobOffer){ 
    console.log("Contract accepted with the following details: "); 
    console.log(jobOffer); 
} 

function keepCalmAndDrinkWine(err){ 
    console.log("Too bad it did not work for this reason: %s ", err); 
} 

function relocate(){ 
    console.log("Relocating (a new Promise ;-)) "); 
} 
+0

感謝您的好點。我很有承諾的新事物。但我需要知道我該如何做我想做的事。在您的代碼中,我無法將任何偵聽器函數添加到「acceptedContract」並立即運行。 – Samed

+0

你是什麼意思「不能添加監聽功能」?當然你可以把它們附加到你想要的每一個承諾上。 – Bergi

+0

我真的搞砸了。你能舉個例子嗎? http://jsfiddle.net/mskasal/fsEKF/2/ – Samed