2014-11-03 115 views
-3

我想了解這個代碼示例。我擦洗網址張貼的目的,但我相當肯定,這不是我的腳本/調試F12看着問題..... ,和控制檯說:爲什麼「未定義爲null或不是對象」?

LOG:一

'未定義' 是在此行空或不是對象
「A(),然後(B()),然後(C()),然後(d());。。。」

我也剝去了2秒延遲&把警報(),同樣的錯誤。
...小幫手?

<script> 
function A() { 
    console.log("A"); 
} 

function B() { 
    console.log("B"); 
    var intervalId = setInterval(function() { 
     clearInterval(intervalId); 
     console.log("Section: "); 
     deferred.resolve(); 
    }, 2000); 
    console.log("B and 2 sec"); 

} 

function C() { 
    console.log("C"); 
} 

function D() { 
    console.log("D"); 
} 

function dMain() { 

    A().then(B()).then(C()).then(D()); 
} 
</script> 

<input id="clickMe" type="button" value="Generate Exam" onclick="javascript:dMain();" /> 
+4

這段代碼有很多問題,很難知道從哪裏開始。什麼是'deferred.resolve();'爲你?你應該看看http://api.jquery.com/jquery.deferred/ – 2014-11-03 14:54:29

+3

'A()'調用'console.log',它返回undefined。你不能調用未定義的函數。 – kingdamian42 2014-11-03 14:54:46

+1

你有一個你從未創建過的'deferred'變量。我認爲存在這個問題。 – 2014-11-03 14:55:47

回答

1

你的功能A不返回任何東西,所以嘗試使用返回值相當於undefined.then()和不確定是不是一個對象。

你可能想要的是使用某種類型的延期,可能jQuery's version。有幾個很好的例子on their site,所以你可能會考慮是這樣的:

function A() { 
    var def = $.Deferred(); 
    console.log("A"); 
    def.resolve(); 
    return def; 
} 

這將返回延期對象,這恰好已經得到解決。

對於您的A().then(B()).then(C()).then(D())行,您可能希望在前一個函數解決時調用每個函數。您當前的代碼要求每個函數都返回一個延遲對象,但也會在開始時調用它們。我不知道處理的最佳方式(取決於你用它去的地方),但這樣的事情可能工作:

A().then(function() { 
    B().then(function() { 
     C().then(function() { 
      D(); 
     }); 
    }); 
}); 

每個功能將先前推遲解決後調用,大概在所有的等待和間隔期滿後。

+0

謝謝你.... THAT作品游泳;它是一個組合,沒有從每個函數獲取構建並返回的Deffered var,並在順序調用中使用大括號。 – jazaddict 2014-11-03 16:37:58

相關問題