2017-07-10 173 views
3

我在我的代碼段,看起來像這樣匿名函數參數

var locationDefer = $.Deferred(); 

if (saSel.Company === -1) { 
    database.getAllLocations().then(function (result) { 
     var locations = JSON.parse(result.d); 
     locationDefer.resolve(locations); 
    }); 
} else { 
    database.getLocationsForCompany(saSel.Company).then(function (result) { 
     var locations = JSON.parse(result.d);     
     locationDefer.resolve(locations); 
    }); 
} 

然而,由於它基本上是同樣的事情兩次,只是用不同的AJAX調用 - 有什麼辦法要麼有匿名函數部分

function (result) { 
    var locations = JSON.parse(result.d); 
    locationDefer.resolve(locations); 
}) 

聲明爲一個真正的功能,然後就稱爲了。那麼()子句,或可我莫名其妙地提供給被稱爲功能的數據庫對象?

對於後者,我腦海中有些東西可能看起來像這樣,但我不知道如何做最後一行。

if(saSel.Company === -1) { 
    fun = 'getAllLocations'; 
    arg = null; 
} else { 
    fun = 'getLocationsForCompany'; 
    arg = saSel.Company; 
} 

// database.fun(arg).then(function (result) {...}); 
+0

避免[deferred antipattern](https://stackoverflow.com/q/23803743/1048572?What-is-the-promise-construction-antipattern-and-how-to-avoid-它)! – Bergi

+0

「*有什麼辦法可以將匿名函數聲明爲真實函數,然後在.then()子句中調用*」 - 當然有!只要你傳遞一個函數作爲參數,沒有方法關心你使用的語法。你試過了嗎? – Bergi

+0

請勿使用'fun'和'arg'。但是你可以簡單地存儲'database.getAllLocations()'或'database.getLocationsForCompany(saSel.Company)'返回一個變量的承諾,然後在該變量上調用'.then()'。 – Bergi

回答

3

您可以定義一個函數,並通過其作爲成功回調處理程序參照

//Define the function handler 
function resultHandler(result) { 
    var locations = JSON.parse(result.d); 
    locationDefer.resolve(locations); 
} 

if (saSel.Company === -1) { 
    fun = 'getAllLocations'; 
    arg = null; 
} else { 
    fun = 'getLocationsForCompany'; 
    arg = saSel.Company; 
} 

//Invoke the method using Bracket notation 
//And, pass the success handler as reference 
database[fun](arg).then(resultHandler); 

此外,由於getLocationsForCompany()getAllLocations()返回一個承諾,你不應該使用$.Deferred()直接返回無極

return database[fun](arg); 
+0

哇,通過名稱與數據庫[名稱](ARG)調用函數沒有想到。非常感謝你! – Decay42