Javascript nodejs可怕的异步问题
我正在使用强大的第三方模块开发nodejs应用程序。我正在尝试对下面的form.parse方法返回的webform字段进行全局范围访问(请参见下面的var formfields)。首先,form.parse是一个异步操作,根据模块docs here:设计用于接受回调。我正在这样做,请查看传递给form.parse的匿名函数 我的问题是,无论我做什么,我都无法获得form.parse来正确地将fields对象返回到全局上下文/范围中的formfields变量。我已经尝试了(几天)回调函数和闭包的各种组合,它们返回辅助函数等等,但没有成功 我想做的基本事情是: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变量。我已经尝试了(几天)回调函数和闭包的各
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)=>{})
在解决了指令不会执行的承诺之后。原因可能是什么?这几乎不可能说,因为它完全取决于上下文-你想在哪里做,以及预期的结果是什么。如果您粘贴一段代码,我应该能够指出问题并提出解决方案。