2013-05-15 41 views
0

我有了這個功能是測試如果一個腳本被加載:爲什麼我的函數不能返回true?

function urlExists(url){ 
    $.ajax({ 
     url: url, 
     success: function(data){ 
     //alert(url + ' exists'); 
     console.log(url + ' exists'); 
     return true 
     }, 
     error: function(data){ 
     //alert(url + ' failed to load'); 
     console.log(url + ' failed to load'); 
     return false 
     } 
    }); 
} 

然後我把它以這種方式:

if (urlExists('file.js')) { 
    var rm = true; 
} 

但即使我得到的console.log的網址存在,我的變種rm仍然未定義。

我試着用阿倫P佐尼的解決方案,像這樣:

urlExists('file.js', function(result){ 
    if(result){ 
     rm = true; 
    } 
}); 

但是RM是即使file.js仍然存在不確定的,我得到的是這樣說的控制檯日誌。

回答

1

更新: 作爲@ phant0m指出的那樣,你是不是從urlExists返回任何值,無論是return語句是傳遞給Ajax調用回調方法的一部分。所以你的urlExists()總是返回undefined,導致if條件失敗。

因爲urlExists使用Ajax調用在本質上是異步意味着一旦該請求被髮送到服務器urlExists方法存在返回undefined造成你如果條件失敗。

在這種情況下,解決方案是使用回調方法,一旦異步任務完成,結果就會執行結果。

在這種情況下,我們可以改變urlExists接受一個回調函數如下給出調用回調函數取決於AJAX調用的結果要麼truefalse

function urlExists(url, callback){ 
    $.ajax({ 
     url: url, 
     success: function(data){ 
     //alert(url + ' exists'); 
     console.log(url + ' exists'); 
     callback(true) 
     }, 
     error: function(data){ 
     //alert(url + ' failed to load'); 
     console.log(url + ' failed to load'); 
     callback(false) 
     } 
    }); 
} 

然後

urlExists('file.js', function(result){ 
    if(result){ 
    } 
}) 
+0

ajax是否是異步的是無關緊要的。即使它是同步的,它也不起作用,因爲'return'語句與urlExists函數沒有任何關係。否則,好帖子。 – phant0m

+0

@ phant0m對不起,錯過了這一點,更新應該修復問題 –

1

urlExists功能不必在全部return聲明(所以它總是返回undefined)。

做的功能是分配給ajax處理程序的事件處理程序。它們甚至不會在收到HTTP響應之後纔會觸發,這將在urlExists函數完成運行後返回,並返回它將返回的任何內容。

如果您希望對正在處理的ajax響應做出反應,那麼您必須在事件處理程序中執行此操作。你不能返回給調用者,因爲它將完成並消失。

this question的回答可以找到對此的擴展解釋。你的例子不關心返回實際數據,但原理是一樣的。

+0

+1'urlExists函數根本沒有return語句.'所有其他人都漏掉的顯而易見的重要位。 – phant0m

0

successerror函數是回調方法。它們不是功能urlExists的一部分。相反,它們是傳遞給$.ajax的參數的一部分。

0

您的呼叫正在異步執行。第一個函數創建一個Ajax調用並添加成功和錯誤處理程序,然後立即完成。由於第一個函數中沒有返回語句,它將返回undefined。執行行var rm = true;後執行成功回調。你應該使用回調從你的函數中獲取結果。

相關問題