2015-09-23 3 views
2

Я пытаюсь понять сумасшедший мир обещаний javascript и наткнулся на это, что я не понимаю.Javascript Обещает явные функции против встроенных функций

Первая программа из книги объясняя обещание цепочки и работает точно так же, как вы могли бы подумать:

var Promise = require('promise'); 

function delay(time) { 
    return new Promise(function(resolve,reject) { 
     setTimeout(resolve, time); 
    }); 
} 

delay(1000) // step 1 
    .then(function STEP2(){ 
     console.log("step 2b (after 1000ms)"); 
     return delay(2000); 
    }) 
    .then(function STEP3(){ 
     console.log("step 3b (after another 2000ms)"); 
    }) 
    .then(function STEP4(){ 
     console.log("step 4b (next Job)"); 
     return delay(5000); 
    }) 
    .then(function STEP5() { 
     console.log("step 5b (after another 5000ms)"); 
    }); 

На консоли журналов появляются после того, как правильное количество задержек.

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

var Promise = require('promise'); 

function delay(time) { 
    return new Promise(function(resolve,reject){ 
     setTimeout(resolve, time); 
    }); 
} 
function STEP2() { 
    console.log("step 2 (after 1000ms)"); 
    return delay(2000); 
} 
function STEP3() { 
    console.log("step 3 (after another 2000ms)");  
} 
function STEP4() { 
    console.log("step 4 (next Job)"); 
    return delay(5000); 
} 
function STEP5() { 
    console.log("step 5 (after another 5000ms)"); 
} 

delay(1000).then(STEP2()).then(STEP3()).then(STEP4()).then(STEP5()); 

Но теперь все журналы консоль произойдут сразу, программу задерживает 5000 мс и затем выходит. Может ли кто-нибудь объяснить, что другое (функционально) между двумя приведенными выше примерами? Спасибо.

+2

В первом варианте вы не вызывая функции шага (просто передавая их в качестве параметров). – thebjorn

+0

[Голосование, чтобы закрыть это как не по теме (# 2)] (http://stackoverflow.com/help/on-topic). – zzzzBov

+0

@zzzzBov Какая часть этого вопроса вне темы для вас? – Tomalak

ответ

6

В первом примере вы передаете функцию. В вашем втором примере вы передаете результат функции, так как после имени функции вы включили ().

Это, вероятно, что вы хотите сделать:

delay(1000).then(STEP2).then(STEP3).then(STEP4).then(STEP5); 
+0

Ну, конечно, это трюк, но меня все еще смущает. Это можно свести к следующему: delay (2000). Then (function() {console.log («После 2000ms»)}); работает, но 'delay (2000). then (console.log (« После 2000ms »)); не – kevdev

+2

@ kevdev - вам нужно передать ссылку на функцию, чтобы инфраструктура обещания позже могла ее назвать. 'function() {console.log (" После 2000ms ")}' является ссылкой на функцию. 'Консоли.log («После 2000ms») 'не является ссылкой на функцию. Это запускает 'console.log()' немедленно и передает результат возврата из его выполнения, который является 'undefined'. – jfriend00

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