2014-11-03 4 views
-3

Я пытаюсь понять этот пример кода. Я вымыла URL для размещения целей, но я уверен, что разумно это не проблема ..... я смотрю на/Debug F12 Script, а консоль говорит:Почему "undefined является null или не является объектом"?

LOG: A

'не определено' равно нулю или не является объектом
на этой линии "А(), а затем (в()), а затем (С()), то (D());..."

Я также разделил 2-секундную задержку & поставить предупреждение(), ту же ошибку.
... lil 'help?

<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/ –

+3

'A()' вызывает 'console.log', который возвращает undefined. Вы не можете вызвать функцию по неопределенной. – kingdamian42

+1

У вас есть переменная 'offferred', которую вы никогда не создавали. Я думаю, что есть проблема. –

ответ

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

УБЕДИТЕСЬ, ЧТО ... ЧТО работает плавно; это была комбинация того, чтобы не получить Deffered var, построенный и возвращенный из каждой функции, и использование фигурных скобок в последовательном вызове. – jazaddict

Смежные вопросы