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 мс и потом завершает работу. Может кто-нибудь объяснить, чем (функционально) отличаются два приведенных выше примера? Спасибо.


person kevdev    schedule 23.09.2015    source источник
comment
В первой версии вы не вызываете пошаговые функции (просто передаете их как параметры).   -  person thebjorn    schedule 24.09.2015
comment
@zzzzBov Какая часть этого вопроса для вас не по теме?   -  person Tomalak    schedule 24.09.2015
comment
@kevdev Подсказка: вы должны иметь возможность преобразовать первый образец во второй образец исключительно с помощью копирования и вставки. Если вы не можете этого сделать, два примера кода не эквивалентны.   -  person Tomalak    schedule 24.09.2015
comment
Должна быть дублирующая цель, которую мы можем использовать для такой распространенной ошибки.   -  person Kevin B    schedule 24.09.2015
comment
@Tomalak, я думал, что ясно выразился, связав, а затем указав число для чтения, но конкретно вопросы о проблеме, которую больше нельзя воспроизвести или которая была вызвана простой опечаткой. Простая типографская ошибка заключается в том, что есть () символов, когда не должно быть () символов.   -  person zzzzBov    schedule 24.09.2015
comment
@Tomalak, но не стесняйтесь помечать его как дубликат другой вопрос.   -  person zzzzBov    schedule 24.09.2015
comment
@zzzzBov Добавление () в код JS не является типографской ошибкой. Почему ты так думаешь?   -  person Tomalak    schedule 24.09.2015
comment
@Tomalak, набирать (), когда этого делать не следовало, - это такая же ошибка, как и опечатка.   -  person zzzzBov    schedule 24.09.2015
comment
@zzzzBov Нет. Это указывает на то, что вы не поняли принципиальной разницы между foo и foo(). И это семантическая ошибка, совершенно отличная от опечатки в имени функции или написания , вместо ; в операторе цикла for. И люди, задающие вопросы о своих семантических ошибках, здесь, чтобы учиться, в отличие от толпы, пожалуйста, исправьте мой код. Они настолько в теме, насколько это возможно.   -  person Tomalak    schedule 24.09.2015
comment
Нет. Это не типографская ошибка, потому что до сих пор я не знал, что это имеет значение в отношении того, когда функция запускается между ее передачей в качестве параметра или вызовом. Я наивно думал, что функции STEP() будут вызываться после задержки. Конечно не опечатка.   -  person kevdev    schedule 24.09.2015


Ответы (1)


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

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

delay( 1000 ).then(STEP2).then(STEP3).then(STEP4).then(STEP5);
person Anid Monsur    schedule 23.09.2015
comment
Ну, это, конечно, сработало, но все еще оставляет меня в замешательстве. Его можно свести к следующему: delay(2000).then(function () {console.log(After 2000ms)}); работает, но `delay(2000).then(console.log(после 2000 мс));' не - person kevdev; 24.09.2015
comment
@kevdev - вы должны передать ссылку на функцию, чтобы инфраструктура обещаний могла вызвать ее позже. function () {console.log("After 2000ms")} — ссылка на функцию. console.log("After 2000ms") не является ссылкой на функцию. Это немедленно запускает console.log() и передает возвращаемый результат его выполнения, который равен undefined. - person jfriend00; 24.09.2015