Я пытаюсь получить значение в полях результатов, чтобы управлять ими немного в коде, но у меня есть undefined в console.info. Пожалуйста, объясните, почему и как я могу получить свои поля в коде.
var multiparty = require('multiparty')
module.exports.login = function(req, res) {
var form = new multiparty.Form();
const result = form.parse(req, function(err, fields, files) {
console.info(err, fields, files);
return fields
})
console.info('result=>',result)//undefined
res.send('Hello from Express!')
};
Я понимаю, что мне нужно использовать обещания, но я не знаю, как это сделать, пожалуйста, покажите мне пример вашего кода
var multiparty = require('multiparty')
module.exports.login = function(req, res) {
var form = new multiparty.Form();
var result = () => { form.parse(req, function(err, fields, files) {
console.info(err, fields, files);
return new Promise(function(resolve, reject) {
resolve(fields);
})
})}
console.info('result=>',result.resolve)
res.send('Hello from Express!')
};



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Не определено, потому что функция, переданная в методе синтаксического анализа, является обратным вызовом, и вы не можете получить возврат от обратного вызова. попробуй это
var multiparty = require('multiparty')
module.exports.login = function(req, res) {
var form = new multiparty.Form();
form.parse(req, function(err, fields, files) {
console.info(err, fields, files);
console.info('result=>',fields)
res.send('Hello from Express!')
})
};
Может быть, я могу поместить переменную полей где-нибудь, чтобы использовать ее после метода синтаксического анализа? Как видите, я пытаюсь использовать обещания, но в моем случае это не дает результатов.
в функции обратного вызова синтаксического анализа вызовите другую внешнюю функцию, которая может сохранить данный аргумент из синтаксического анализа. создайте новую функцию и вызовите ее. как сохранить (поля)
Пожалуйста, покажите код, я не понимаю, что
Было бы проще, если бы вы прошли вводный курс по javascript. Асинхронность — это широкая тема, и ее может быть трудно объяснить на этом сайте.
Пожалуйста, покажите, как это можно сделать, это интересно для меня Спасибо По обещанию в обратном вызове
[1, 2, 3].map(nr => nr + 1) — хороший тому пример. Здесь возвращаемое значение предоставленного обратного вызова возвращается вам для каждого элемента. Это не относится к parse, так как метод всегда возвращает undefined (не имеет возвращаемого значения). В противном случае ответ в порядке.
Я не знаком с multiparty и не знаю, называется ли предоставленный обратный вызов синхронным или асинхронным. Самым коротким решением по-прежнему является ответ Артура Т, просто перемещающий весь код в обратный вызов. Однако, если код становится более сложным, это может быть не лучшим решением. Вам также следует обратить внимание на ад обратного звонка.
Если обратный вызов вызывается синхронно, вы можете просто сделать следующее:
var result,
form = new multiparty.Form();
form.parse(req, function(err, fields, files) {
console.info(err, fields, files);
result = fields;
// ^ set the result variable instead of returning
});
// ...
Если обратный вызов вызывается в асинхронном режиме, все становится сложнее, и вам нужно обернуть обратный вызов в создание промиса.
var form = new multiparty.Form();
const result = new Promise(resolve => {
form.parse(req, function(err, fields, files) {
console.info(err, fields, files);
resolve(fields);
// ^ resolve the promise with fields as passed value
});
});
result.then(fields => {
console.info('result=>', fields);
res.send('Hello from Express!');
});
В качестве альтернативы вы можете изменить свою функцию на функцию async (это означает, что возвращаемое значение будет заключено в обещание). Что относительно новое, но коды чище.
module.exports.login = async function(req, res) {
// ^ notice the async keyword
var form = new multiparty.Form();
const result = await new Promise(resolve => {
form.parse(req, function(err, fields, files) {
console.info(err, fields, files);
resolve(fields);
});
});
console.info('result=>', result);
res.send('Hello from Express!');
};
Всю структуру можно упростить, если исключить промежуточную регистрацию.
const [err, fields, files] = await new Promise(resolve =>
form.parse(req, (...args) => resolve(args)));
// ^ ^
// collect all arguments into an array and use that as resolve value
// ...
Дополнительные сведения о стрелочные функции, обещания и асинхронная функция см. в документации. В этом последнем примере также используются удаление присвоения и спред оператор.
Пожалуйста, покажите пример кода, я не могу понять, я новичок в JS