Javascript 无法返回来自承诺的结果
我试图从两个不同的表中读取一些数据,并在呈现ejs文件之前解析CSV文件。 我可以从两个表和CSV文件中获取数据,但似乎无法返回结果 我很确定这是我处理异步执行的方式的一个问题,但我看不出我做错了什么 在过去的两天里,我一直在阅读(包括这里的帖子)和浏览,但不知怎么的,我还是找不到答案 第一个文件-usercms.jsJavascript 无法返回来自承诺的结果,javascript,node.js,asynchronous,es6-promise,Javascript,Node.js,Asynchronous,Es6 Promise,我试图从两个不同的表中读取一些数据,并在呈现ejs文件之前解析CSV文件。 我可以从两个表和CSV文件中获取数据,但似乎无法返回结果 我很确定这是我处理异步执行的方式的一个问题,但我看不出我做错了什么 在过去的两天里,我一直在阅读(包括这里的帖子)和浏览,但不知怎么的,我还是找不到答案 第一个文件-usercms.js app.get('/userscms', function(req, res) { existingUsers.getExistingUsers(
app.get('/userscms', function(req, res)
{
existingUsers.getExistingUsers()
.then(function(appUsers)
{
//global users array
//I can display these in my ejs file
globalAppUsers = appUsers;
})
.then(existingUsersAttributesQlik.getExistingUsersAttributesQlik())
.then(function(usersQlikAttributes)
{
//global user attributes array
//undefined data
globalUsersQlikAttributes = usersQlikAttributes;
})
.then(existingSuppliers.parseSuppliersCSV())
.then(function(supplierData)
{
//the result I am expecting
//this prints undefined
console.log(supplierData);
}).then(function()
{
res.render('userscms.ejs',
{
users: globalAppUsers,
attributes: globalUsersQlikAttributes
});
});
});
第二个函数-getxistingUsers.js(与getExistingUsersAttributesQlik相同,但查询除外)
你知道我做错了什么吗?我是不是走错了路?我在这里猜测一下,并假设您创建的承诺应该解决一些问题……而不是返回一个值
.on("end", function ()
{
console.log("done");
//all OK here
console.log(suppliersData);
//this doesn't seem to return anything
return resolve(suppliersData);
});
您可能希望
resolve
而不是return
:resolve(供应商数据)代码>。然后(existingUsersAttributesQlik.getExistingUsersAttributesQlik())
将无法工作。必须先将函数传递给,然后传递给,而不是承诺。避免使用globalAppUsers
和globalUsersQlikAttributes
之类的东西。请参阅以获得更好的方法。@Bergi-谢谢,这很有帮助。关于全局变量,我不打算就这样离开它们。@Mark-谢谢。更改为解析并返回函数(基于Berg的建议)。谢谢。更改为解析并返回函数(基于Berg的建议)。
var supplierData = [];
var suppliersData = [];
var csvCount = 0;
(function (exports)
{
exports.parseSuppliersCSV = function ()
{
return new Promise(function(resolve, reject)
{
var fileStream = fs.createReadStream("myCSV.csv");
var parser = fastCsv();
csvCount = 0;
supplierData = [];
suppliersData = [];
fileStream
.on("readable", function ()
{
var data;
while ((data = fileStream.read()) !== null)
{
parser.write(data);
}
})
.on("end", function ()
{
parser.end();
});
parser
.on("readable", function ()
{
var data;
while ((data = parser.read()) !== null)
{
if(csvCount >= 1)
{
csvCount++;
var arrayOfStrings = data[0].split(';');
var supplier = new supplierModel.Supplier(arrayOfStrings[0],arrayOfStrings[1]);
suppliersData.push(_.toArray(supplier));
}
else
{
csvCount++;
}
}
})
.on("end", function ()
{
console.log("done");
//all OK here
console.log(suppliersData);
//this doesn't seem to return anything
return suppliersData;
});
});
};
})(typeof exports === 'undefined' ? this['parseSuppliersCSV'] = {} : exports);
.on("end", function ()
{
console.log("done");
//all OK here
console.log(suppliersData);
//this doesn't seem to return anything
return resolve(suppliersData);
});