2014-09-29 3 views
1

Я пытаюсь понять обещание. Но здесь я смущен. Я хочу создать тестовую функцию, которая будет печатать 3000 через 3 секунды, затем распечатать 2000 через 2 секунды, а затем распечатать 1000 через 1 секунду. Вот мой код:Может ли кто-нибудь объяснить мне следующий код?

'use strict'; 
var Q = require('q'); 

function delayConsole(timeOut) { 
    var defer = Q.defer(); 
    setTimeout(function(){ 
     console.log(timeOut); 
     defer.resolve(2000); 
    },timeOut); 
    return defer.promise; 
} 

// This works 
delayConsole(3000).then(function(){ 
    return delayConsole(2000); 
}).then(function(){ 
    return delayConsole(1000); 
    }); 

// This doesn't work. Why? 
delayConsole(3000).then(delayConsole(2000)).then(delayConsole(1000)); 

ответ

1

Там вы вызовите функцию delayConsole немедленно:

.then(delayConsole(2000)) 

То есть: вы не передаете функции, но результат вызова функции, вы не Ждите обещаний, чтобы они были прикованы.

Когда вы

then(function(){ 
    return delayConsole(2000); 
}) 

то передать функцию, а не результат этого вызова функции. Функция может быть вызвана, когда решается предыдущий элемент в цепочке обещаний.

+2

Возможно, стоит отметить, что Q поставляется с функцией '.delay'. –

+0

Это объясняет многое. Спасибо – eeandrew

0

Я просто думал, что я хотел бы поделиться, что вы можете сделать это строительные работы, которую иногда проще использовать:

promise.then(delayConsole(3000)).then(delayConsole(2000)).then(delayConsole(1000)); 

путем изменения delayConsole() к этому:

function delayConsole(timeOut) { 
    return function() { 
     var defer = Q.defer(); 
     setTimeout(function(){ 
      console.log(timeOut); 
      defer.resolve(2000); 
     },timeOut); 
     return defer.promise; 
    } 
} 

Таким образом, вызов delayConsole() просто фиксирует аргумент тайм-аута и возвращает функцию, которая может быть вызвана позже по обещанию .then. Таким образом, вы все еще передаете ссылку функции на обработчик .then(), который позволяет механизму обещания вызывать внутреннюю функцию через некоторое время, а не выполнять ее сейчас.

+0

Спасибо jfriend00. Вы, ребята, здорово! – eeandrew

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