Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/411.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript nodejs可怕的异步问题_Javascript_Node.js_Formidable - Fatal编程技术网

Javascript nodejs可怕的异步问题

Javascript nodejs可怕的异步问题,javascript,node.js,formidable,Javascript,Node.js,Formidable,我正在使用强大的第三方模块开发nodejs应用程序。我正在尝试对下面的form.parse方法返回的webform字段进行全局范围访问(请参见下面的var formfields)。首先,form.parse是一个异步操作,根据模块docs here:设计用于接受回调。我正在这样做,请查看传递给form.parse的匿名函数 我的问题是,无论我做什么,我都无法获得form.parse来正确地将fields对象返回到全局上下文/范围中的formfields变量。我已经尝试了(几天)回调函数和闭包的各

我正在使用强大的第三方模块开发nodejs应用程序。我正在尝试对下面的form.parse方法返回的webform字段进行全局范围访问(请参见下面的var formfields)。首先,form.parse是一个异步操作,根据模块docs here:设计用于接受回调。我正在这样做,请查看传递给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输出中所看到的,即使我使用回调,执行也会“下降”到最后2行代码console.log——然后在form.parse中运行console.log行或从form.parse正确返回“fields”并将其分配给“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
具体来说,console.log输出显示form.parse返回一个对象(字段)以变为formfields。但是它缺少实际的表单数据(例如formfields.subjects),这些数据记录为未定义。输出的最后一行显示form.parse正在获取表单数据(fields.subjects,记录为“biology”),但没有正确地将其返回为“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中访问和操作字段数据。但我要处理表单数据(db查询、结果格式化、返回到客户机)的各种事情,它们都必须嵌套在form.parse中。这是可行的,但会产生笨拙的代码。我希望我的问题能有一个解决方案,因为这会使代码更简洁。提前感谢您的帮助。

您看到的是异步JavaScript的基本行为。看起来你已经意识到了这一点,但为了以防万一,如果有任何困惑,我建议你仔细阅读。谷歌搜索“javascript异步性、回调和承诺”就足够了

现在谈谈声明:

这是可行的,但会产生笨拙的代码

我想从某种意义上讲,这是一种尴尬的做法,但在约10年前,承诺被jQuery引入,后来被ES2015引入,后来被
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的工作方式,仍然会发生异步调用


还要注意的是,这不会在NodeJ上本机工作,因此您必须控制您的环境,因为您需要执行一些Babel传输。基于您的编码风格,我猜您不一定知道所有这些。如果是真的,你可能想阅读新的ECMAScript和如何处理这些新的特性。

你的问题太长了,考虑阅读,要么同步处理,要么回调,或者在回调函数中控制你的日志。即使在我的NoDEJS环境中,你的解决方案也很好。感谢您的帮助。如果以后我想做类似的事情,该怎么办:
form.on('file',(name,file)=>{})
在解决了指令不会执行的承诺之后。原因可能是什么?这几乎不可能说,因为它完全取决于上下文-你想在哪里做,以及预期的结果是什么。如果您粘贴一段代码,我应该能够指出问题并提出解决方案。