2015-12-17 2 views
2
exports.index = function(req, res) { 
moviedb.indexMovie() 
.then(x => { 
    Movie.findAsync() 
     .then(responseWithResult(res)) 
     .catch(handleError(res)) 
     } 
) 
}; 

function responseWithResult(res, statusCode) { 
    statusCode = statusCode || 200; 
    console.log("Populating Response"); 
    return function(entity) { 
    if (entity) { 
     res.status(statusCode).json(entity); 
    } 
    }; 
} 

Приведенный выше код работает отлично, возвращенная функция в функции responsewithresult заполняется с ответом .then. Тем не менее, я экспериментировал и пытался это вместо этого, но это не сработало. Пожалуйста, объясните почему?Javascript Анонимная функция в течение этого звонка

exports.index = function(req, res) { 
    moviedb.indexMovie() 
    .then(x => { 
     Movie.findAsync() 
     .then(x => {responseWithResult(res)}) // <-- this doesn't work 
     .catch(handleError(res)) 
    }) 
}; 

ответ

0

Это не работает, так как

.then(responseWithResult(res)) 

передает результат responseWithResult (который является функцией, которая в конечном итоге возвращает значение) к функции then, тогда как

x => {responseWithResult(res)} 

, который логически, как

function(x) { 
    responseWithResult(res); 
} 

и когда вы помещаете это внутри then(...), ничего не возвращается.

Вам может исправить с

then(x => responseWithResult(res)) 

который походит

function(x) { 
    return responseWithResult(res); 
} 

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

exports.index = function(req, res) { 
    moviedb.indexMovie() 
    .then(() => Movie.findAsync()) 
    .then(movie => responseWithResult(movie, res)) 
    .catch(() => handleError(res)) 
}; 

function responseWithResult(entity, res, statusCode) { 
    statusCode = statusCode || 200; 
    console.log("Populating Response"); 
    res.status(statusCode).json(entity); 
} 
3

Поскольку вы возвращение неопределенными, добавьте return до того, как responseWithRest вызова или удалить {} S вокруг него, чтобы сделать его функцию выражения стрелка.

Обещает работу по возврату стоимости.

Ваш первый пример также не выполняет операции последовательности. Функции вызывают немедленно.

+0

У меня есть первая часть. Но можете ли вы рассказать о том, что вы подразумеваете под «doesnt sequence operations». – shiv

+0

@ Бенджамин прав. См. Пример документации: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Arrow_functions#Shorter_functions – Nirus

+0

Теперь я понимаю бит операции со стрелкой. О том, о чем говорила Бэнжамин в последовательности. Как я могу это сделать и каковы преимущества? – shiv

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