setTimeout внутри объекта Promise - PullRequest
0 голосов
/ 31 мая 2018

Я начинаю путешествие на JS и NodeJS.При написании приложения hello-world встречалось другое поведение setTimeout.Было бы замечательно, если бы я мог знать причину этой разницы.

Сценарий 1 : ответ ожидает в течение 5 секунд
Сценарий 2 : Запрос будет решен немедленнохотя тайм-аут установлен на 5 секунд

Разница в коде в двух сценариях равна;в сценарии-1 setTimeout имеет анонимную функцию, а в сценарии-2 он вызывает другую функцию в том же модуле.

calculator.js

Сценарий-1:

module.exports.addNumbers = function(numberArray){

    return new Promise(function(fullfil, reject){
        setTimeout(() => {
            if(!(typeof numberArray === 'Array'))
                reject('Not number elements found!');
        },5000);
        //fullfil(10000);
    });

}

enter image description here

Сценарий-2:

module.exports.addNumbers = function(numberArray){
    return new Promise(function(fullfil, reject){
        setTimeout(add(numberArray, fullfil, reject),5000);
        //fullfil(10000);
    });
}

function add(numberArray, fullfil, reject){
    if(!(typeof numberArray === 'Array'))
        reject('Not number elements found!');
}

enter image description here

Маршрутизатор (одинаковый в обоих сценариях):

var express = require('express');
var router = express.Router();
var calculator = require('../services/calculator');

router.get('/',function(req,res,next){

    //res.writeHeader(200,{'content-type':'text/plain'});

    res.send('Hello World - ' + JSON.stringify(res));
    console.log(res);
});

router.get('/testpromise',function(req,res,next){

    calculator.addNumbers('First Try')
        .then(function(result){
            res.send(' Final Result ## '+result);
        })
        .catch(function(err){
            res.send(' ERROR MSG ## '+err);
            console.error(' ERROR MSG ##' +err);
        });

});

module.exports = router;

Ответы [ 2 ]

0 голосов
/ 31 мая 2018
function foo(varOne, varTwo) {
  console.log(varOne, varTwo);
}

setTimeout(foo, 5000, 1, 2); // you pass the parameters after the time parameter

setTimeout(()=> {foo(1, 2)}, 5000); // you call the function inside an anonymous function

Вы можете проверить это для более подробной информации: Как я могу передать параметр в функцию обратного вызова setTimeout ()?

0 голосов
/ 31 мая 2018

Первый аргумент setTimeout должен быть вызываемой функцией.

В первом примере вы предоставляете такую ​​функцию (() => {}):

  setTimeout(() => {
        if(!(typeof numberArray === 'Array'))
            reject('Not number elements found!');
    },5000);

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

setTimeout(add(numberArray, fullfil, reject),5000);

Насколько я могу видеть add(numberArray, fullfil, reject) не не возвращает функцию.

Вы можете сделать это, чтобы обернуть ее в функцию:

setTimeout(() => add(numberArray, fullfil, reject),5000);

или заставить add вернуть функцию:

function add(numberArray, fullfil, reject){
    return () => {
        if(!(typeof numberArray === 'Array'))
            reject('Not number elements found!');
    }
}
// or 
function add(numberArray, fullfil, reject){
    return function() {
        if(!(typeof numberArray === 'Array'))
            reject('Not number elements found!');
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...