Javascript 承诺,回报承诺

Javascript 承诺,回报承诺,javascript,mysql,angularjs,es6-promise,Javascript,Mysql,Angularjs,Es6 Promise,我即将对这个问题大发雷霆:我打算将一个PHP应用程序翻译成Angular 6,但是我会在JavaSript ES6中开发这个问题,以便在最终确定的代码之前进行简化。情况如下: 我的用户表是: +-------------------------+-----------------------+------+-----+---------+----------------+ | Field | Type | Nu

我即将对这个问题大发雷霆:我打算将一个PHP应用程序翻译成Angular 6,但是我会在JavaSript ES6中开发这个问题,以便在最终确定的代码之前进行简化。情况如下:

我的用户表是:

    +-------------------------+-----------------------+------+-----+---------+----------------+
    | Field                   | Type                  | Null | Key | Default | Extra          |
    +-------------------------+-----------------------+------+-----+---------+----------------+
    | id                      | mediumint(8) unsigned | NO   | PRI | NULL    | auto_increment |
    | ip_address              | varchar(45)           | NO   |     | NULL    |                |
    | username                | varchar(100)          | NO   |     | NULL    |                |
    | password                | varchar(80)           | NO   |     | NULL    |                |
    | salt                    | varchar(40)           | YES  |     | NULL    |                |
    | email                   | varchar(254)          | NO   | UNI | NULL    |                |
    | activation_code         | varchar(40)           | YES  |     | NULL    |                |
    | forgotten_password_code | varchar(40)           | YES  |     | NULL    |                |
    | forgotten_password_time | int(11) unsigned      | YES  |     | NULL    |                |
    | remember_code           | varchar(40)           | YES  |     | NULL    |                |
    | created_on              | int(11) unsigned      | NO   |     | NULL    |                |
    | last_login              | int(11) unsigned      | YES  |     | NULL    |                |
    | active                  | tinyint(1) unsigned   | YES  |     | NULL    |                |
    | first_name              | varchar(50)           | YES  |     | NULL    |                |
    | last_name               | varchar(50)           | YES  |     | NULL    |                |
    | company                 | varchar(100)          | YES  |     | NULL    |                |
    | phone                   | varchar(20)           | YES  |     | NULL    |                |
    +-------------------------+-----------------------+------+-----+---------+----------------+
    +-------------+-----------------------+------+-----+---------+----------------+
    | Field       | Type                  | Null | Key | Default | Extra          |
    +-------------+-----------------------+------+-----+---------+----------------+
    | id          | mediumint(8) unsigned | NO   | PRI | NULL    | auto_increment |
    | name        | varchar(20)           | NO   |     | NULL    |                |
    | description | varchar(100)          | NO   |     | NULL    |                |
    +-------------+-----------------------+------+-----+---------+----------------+
我的分组表是:

    +-------------------------+-----------------------+------+-----+---------+----------------+
    | Field                   | Type                  | Null | Key | Default | Extra          |
    +-------------------------+-----------------------+------+-----+---------+----------------+
    | id                      | mediumint(8) unsigned | NO   | PRI | NULL    | auto_increment |
    | ip_address              | varchar(45)           | NO   |     | NULL    |                |
    | username                | varchar(100)          | NO   |     | NULL    |                |
    | password                | varchar(80)           | NO   |     | NULL    |                |
    | salt                    | varchar(40)           | YES  |     | NULL    |                |
    | email                   | varchar(254)          | NO   | UNI | NULL    |                |
    | activation_code         | varchar(40)           | YES  |     | NULL    |                |
    | forgotten_password_code | varchar(40)           | YES  |     | NULL    |                |
    | forgotten_password_time | int(11) unsigned      | YES  |     | NULL    |                |
    | remember_code           | varchar(40)           | YES  |     | NULL    |                |
    | created_on              | int(11) unsigned      | NO   |     | NULL    |                |
    | last_login              | int(11) unsigned      | YES  |     | NULL    |                |
    | active                  | tinyint(1) unsigned   | YES  |     | NULL    |                |
    | first_name              | varchar(50)           | YES  |     | NULL    |                |
    | last_name               | varchar(50)           | YES  |     | NULL    |                |
    | company                 | varchar(100)          | YES  |     | NULL    |                |
    | phone                   | varchar(20)           | YES  |     | NULL    |                |
    +-------------------------+-----------------------+------+-----+---------+----------------+
    +-------------+-----------------------+------+-----+---------+----------------+
    | Field       | Type                  | Null | Key | Default | Extra          |
    +-------------+-----------------------+------+-----+---------+----------------+
    | id          | mediumint(8) unsigned | NO   | PRI | NULL    | auto_increment |
    | name        | varchar(20)           | NO   |     | NULL    |                |
    | description | varchar(100)          | NO   |     | NULL    |                |
    +-------------+-----------------------+------+-----+---------+----------------+
我还有一个亲戚,比如:

    +----------+-----------------------+------+-----+---------+----------------+
    | Field    | Type                  | Null | Key | Default | Extra          |
    +----------+-----------------------+------+-----+---------+----------------+
    | id       | mediumint(8) unsigned | NO   | PRI | NULL    | auto_increment |
    | user_id  | mediumint(8) unsigned | NO   | MUL | NULL    |                |
    | group_id | mediumint(8) unsigned | NO   | MUL | NULL    |                |
    +----------+-----------------------+------+-----+---------+----------------+
好的,在这种情况下,我希望获得到期用户(在本例中为用户2)所属的所有组

我的JavaScript代码是:

var mysql = require('promise-mysql');

var connection;
var arr = [];

mysql.createConnection({
    host: 'host',
    user: 'user',
    password: 'password',
    database: 'database'
}).then(
    function (conn) {
        connection = conn;
        return conn.query('select * from users_groups where user_id=2');
    }
).then(
    function(value) {
        console.log('Initial value : ' + JSON.stringify(value) );


        for (let user_group of value) {
            console.log('Each value : ' + JSON.stringify(user_group.group_id));
            arr.push( connection.query(`select * from groups where id = ${user_group.group_id}`));
        }     
        return arr;
    }, function (reason) {
        console.log('Rechazo: ' + reason);    
    }
).then (
    function (echo) {
        console.log('Echo: ' + JSON.stringify(echo));
        connection.end();
    }
);
我确实得到了:

Initial value : [{"id":10,"user_id":2,"group_id":1},{"id":11,"user_id":2,"group_id":2}]
Each value : 1
Each value : 2
Echo: [{"isFulfilled":false,"isRejected":false},{"isFulfilled":false,"isRejected":false}]
有人能帮我吗?
提前谢谢

为了使承诺链正常工作,您必须在
中返回承诺,然后调用任何异步操作。在第二次
then
调用中,将一系列异步db调用推送到一个数组中。由于返回的是数组而不是承诺,因此下一次
then
调用不会not等待所有查询完成。将此数组传递给Promise.all
并返回该数组,您将获得所需的结果

var mysql = require('promise-mysql');

var connection;
var arr = [];

mysql.createConnection({
    host: 'host',
    user: 'user',
    password: 'password',
    database: 'database'
}).then(
    function (conn) {
        connection = conn;
        return conn.query('select * from users_groups where user_id=2');
    }
).then(
    function(value) {
        console.log('Initial value : ' + JSON.stringify(value) );


        for (let user_group of value) {
            console.log('Each value : ' + JSON.stringify(user_group.group_id));
            arr.push( connection.query(`select * from groups where id = ${user_group.group_id}`));
        }     
        return Promise.all(arr);
    }, function (reason) {
        console.log('Rechazo: ' + reason);    
    }
).then (
    function (echo) {
        console.log('Echo: ' + JSON.stringify(echo));
        connection.end();
    }
); 

为了让承诺链正常工作,您必须在
调用中返回承诺,然后调用任何异步操作。在第二次
then
调用中,将一系列异步db调用推送到一个数组中。由于返回的是数组而不是承诺,因此下一次
then
调用不会not等待所有查询完成。将此数组传递给Promise.all
并返回该数组,您将获得所需的结果

var mysql = require('promise-mysql');

var connection;
var arr = [];

mysql.createConnection({
    host: 'host',
    user: 'user',
    password: 'password',
    database: 'database'
}).then(
    function (conn) {
        connection = conn;
        return conn.query('select * from users_groups where user_id=2');
    }
).then(
    function(value) {
        console.log('Initial value : ' + JSON.stringify(value) );


        for (let user_group of value) {
            console.log('Each value : ' + JSON.stringify(user_group.group_id));
            arr.push( connection.query(`select * from groups where id = ${user_group.group_id}`));
        }     
        return Promise.all(arr);
    }, function (reason) {
        console.log('Rechazo: ' + reason);    
    }
).then (
    function (echo) {
        console.log('Echo: ' + JSON.stringify(echo));
        connection.end();
    }
); 

代替
return arr
do
return Promise.all(arr)
代替
return arr
do
return Promise.all(arr)
回答得好。我建议你试试看。回答得好。我建议你试试看。