我想从演示中得到一个简单的顺序输出节点.js应用程序和续集,但我似乎无法把我的头包在承诺和蓝鸟,以及如何这些可以帮助我。我想要的结果是:
User: John Doe
Project: "Acme Website": Sample project
Project: "PMC Website": Sample project
Total projects: 2
User: Jane Doe
Project: "ABC Website": Sample project
Total projects: 1
User: Jill Doe
No projects
Total users: 3
我不用快递。这只是一个演示应用程序来解决所有这些问题。
这是我的
User
// models/user.js
'use strict';
module.exports = (sequelize, DataTypes) => {
var User = sequelize.define('User', {
firstName: DataTypes.STRING,
lastName: DataTypes.STRING,
email: DataTypes.STRING
}, {});
User.associate = function(models) {
// associations can be defined here
User.hasMany(models.Project);
};
return User;
};
这是我的
Project
型号:
// models/project.js
'use strict';
module.exports = (sequelize, DataTypes) => {
var Project = sequelize.define('Project', {
title: DataTypes.STRING,
description: DataTypes.TEXT
}, {});
Project.associate = function(models) {
// associations can be defined here
Project.belongsTo(models.User);
};
return Project;
};
我写的代码显然不起作用:
User.findAndCountAll().then((result) => {
if (result.count > 0) {
let users = result.rows;
users.forEach((user, index, arr) => {
console.log('User: ' + user.firstName + ' ' + user.lastName + ' <' + user.email + '>' + '\n' );
user.getProjects().then((projects) => {
projects.forEach((project, index, arr) => {
console.log('\tProject: "' + project.title + '": ' + project.description + '\n');
});
}).then((projects) => {
console.log('\tTotal projects: xxx'); // xxx should be the count
});
}
);
console.log('Total users: ' + result.count);
} else {
console.log('No users');
}
});
我知道我需要用承诺,但我不知道在哪里或如何。我看了一些关于回调和
setTimeout
我不想简单地构造一个数组或值对象,然后在最后输出它,因为它不能解决我无法理解承诺是如何工作的问题。
编辑:
我甚至不确定我问的问题是否正确。我试图通过尝试一个同步示例来理解异步,但这可能不是实现异步的方法。我想答案在于,如果我想使用JavaScript这样的异步平台,就不应该人为地设置类似于sync的等待时间。相反,如果我们考虑上面的例子,最好运行结果并将数据收集到一个对象中,然后输出它。或者,下面@Priyank建议的方法(固定和修改)将给出准确的输出:
User.findAndCountAll({
include:[
Project
]
}).then(result => {
result.rows.forEach((user, index, arr) => {
console.log('User: ' + user.firstName + ' ' + user.lastName + ' <' + user.email + '>');
user.Projects.forEach((project, index, arr) => {
console.log('\tProject: "' + project.title + '": ' + project.description);
});
console.log('\n\tTotal projects: ' + user.Projects.length + '\n');
});
console.log('\nTotal users: ' + result.count + '\n');
}).finally(() => {
process.exit();
});