2015-06-16 216 views
2

我想將一個函數傳遞到另一個函數,以便我可以在ajax調用完成時調用它,但是我收到一個錯誤,說我想調用的函數不是功能。JavaScript函數不調用函數作爲參數傳遞

文件1(先加載)

function functionOne() { 
    //Some Code 
} 

文件2(加載的第二和包含Ajax調用)

function functionTwo(functionOne) { 
    functionOne(); 
} 

functionTwo(); 

我得到的TypeError: functionOne is not a function

控制檯錯誤我的問題是兩折:

  1. 爲什麼functionOne超出了第二個功能的範圍?
  2. 這是確保在運行我的第一個功能代碼之前完成ajax調用的最好方法嗎?
+5

你怎麼稱呼'functionTwo'? – Tushar

+1

*「1.爲什麼functionOne超出了第二個函數的範圍?」*沒有超出範圍。你有一個名爲'functionOne'的參數會影響全局。 *「2.這是確保在運行我的第一個功能代碼之前完成ajax調用的最佳方式嗎?」*取決於您的意思。你並沒有真正展示你在做什麼。 –

+0

@Tushar對不起,它後來被稱爲。修正 – Antfish

回答

2

functionTwo,你的影子functionOne你聲明它作爲參數:在functionTwo代碼只看到這個新的變量,而不是全局的名稱相同。

但是你的方法是錯誤的,它不能確保你正在尋找的執行順序。

jQuery的ajax函數返回promise,這是一種處理異步函數並在ajax調用完成時執行一些函數的方法。

如果你想functionTwo啓動Ajax調用,然後調用functionOne,你可以這樣做:

function functionOne() { 
} 

function functionTwo() { 
    return $.ajax({ // don't forget the return 
     // many parameters here 
    }).then(function(data){ 
     // use the data here 
    }); 
} 

functionTwo().then(functionOne); 

這確保functionOne被稱爲只有在Ajax調用中functionTwo開始已經完成。

如果你想使用的老式方法,並傳遞給函數作爲參數,像這樣做:

function functionOne() { 
} 

function functionTwo(callback) { 
    $.ajax({ 
     // many parameters here 
    }).then(function(data){ 
     // use the data here 
    }).then(callback); 
} 

functionTwo(functionOne); 

但它的2015年,你最好開始尋找deferreds和承諾;)

+0

感謝您的迴應。我確實看過承諾,但不確定如何執行它。 爲了將來的參考,如果我確實想將一個函數傳遞給另一個函數而不是將其映射到另一個函數中,我該怎麼做? – Antfish

+1

@Antfish我編輯過 –

相關問題