nodejs强大的异步问题

时间:2018-12-03 07:01:23

标签: javascript node.js formidable

我正在使用强大的第3方模块开发Node.js应用程序。而且我正在尝试对下面的form.parse方法返回的webform字段进行全局作用域访问(请参见下面的var formfields)。首先,form.parse是一个异步操作,根据此处的模块文档:https://github.com/felixge/node-formidable旨在进行回调。我正在这样做,请参阅传递给form.parse的匿名函数。

我的问题是,无论我做什么,我都无法获得form.parse来将fields对象正确地返回到全局上下文/范围中的formfields变量。我已经尝试(几天)回调函数和闭包的各种组合,它们返回辅助函数,等等。但是没有运气。

我想做的基本事情是:

var form = new formidable.IncomingForm();
form.encoding = 'utf-8';
var formfields = form.parse(req, function (err, fields, files) {
  console.log("within form.parse method, subject field of fields object is: " + fields.subjects);
  return fields;
}); // form.parse

console.log("type of formfields is: " + typeof formfields);
console.log("subject field of formfields object is: " + formfields.subjects);

但是从下面的console.log输出中可以看到,即使我正在使用回调,执行也会“落入”最后两个console.log代码行中-在运行console.log之前form.parse中的行或从form.parse中正确返回“字段”并将其分配给“ var formfields”。

特别是console.log输出显示form.parse返回一个对象(字段)成为formfield。但是它缺少记录为未定义的实际表单数据(例如formfields.subjects)。输出的最后一行显示form.parse正在获取表单数据(fields.subjects,其记录为“生物学”),但没有正确地将其返回为“ var formfields”。

type of formfields is: object
subject field of formfields object is: undefined
within form.parse method, subject field of fields object is: biology

没有对此有解决方案,因为我可以选择仅从form.parse中访问和操作字段数据。但是我与表单数据有很多关系(数据库查询,结果格式,返回客户端),并且它们都必须嵌套在form.parse中。这是可行的,但会使代码笨拙。我希望能解决我的问题,因为这将使代码更简洁。预先感谢您的协助。

1 个答案:

答案 0 :(得分:1)

您将看到异步JavaScript的基本行为。看起来您已经意识到了这一点,但以防万一,如果确实令人困惑,我建议您仔细阅读一下。在Google上搜索“ javascript异步性,回调和承诺”就足够了。

现在进入语句:

  

这是可行的,但会使代码笨拙。

从某种意义上讲,我认为这很尴尬,但这是十年前jQuery提出Promises的方法,后来ES2015引入了Promises的方法,后来被async方法所取代。

在特定情况下可能需要的是哪个。我将假定您的代码包装在某些函数中,如下所示,否则可能无法正常工作。

async function yourFunction() {
    var form = new formidable.IncomingForm();
    form.encoding = 'utf-8';
    var formfields = await new Promise(function (resolve, reject) {
        form.parse(req, function (err, fields, files) {
            if (err) {
                reject(err);
                return;
            }
            console.log("within form.parse method, subject field of fields object is: " + fields.subjects);
            resolve(fields);
        }); // form.parse
    });

    console.log("type of formfields is: " + typeof formfields);
    console.log("subject field of formfields object is: " + formfields.subjects);
}

这将迫使脚本暂停直到解析结束。 resolve(fields)函数调用将确保为您的formFields变量分配了fields对象的值。然后脚本将恢复,您的日志将打印您期望的日志。

请注意,这不会改变JS的工作方式,并且仍然会发生异步调用。

还请注意,这在NodeJS上本身不起作用,因此您必须控制环境,因为您需要进行一些Babel转译。根据您的编码风格,我想您不一定了解所有这些。如果为true,则可能需要阅读有关新ECMAScript以及如何使用新功能的信息。