嵌套承诺时调用退出后无法排队查询

时间:2018-08-07 23:10:13

标签: mysql node.js

我正在尝试遍历MySQL查询结果并进行后续查询,以构建我的数据模型。每个对象都需要多个查询,因此我在链接诺言。

当我嵌套第二组承诺时,就会出现问题。

因此,首先我得到了需要使用g.getSnapshotIds检索的对象的列表。然后,我遍历这些快照,并使用snapshotId检索完整的快照。

<await/>

我能够在每个ID上调用g.getSnapshotFull,但是当我尝试继续进行下一个查询(g.getTs(snapshotId))时,会出现以下错误:

import fsp from 'fs-promise';

$ var filePath = __dirname + '/hello.txt';
$ var readPromise = fsp.readFile(filePath, {encoding: 'utf8'});

<await(helloText from readPromise)>
  <p>
    ${helloText}
  </p>
</await>

我不知道为什么在所有查询完成之前关闭MySQL连接。在继续之前,for循环内的所有内容是否应该按顺序执行?

如果我注释掉g.close(),我不会收到错误,但过程不会结束。

这些是相关的查询方法:

var gData = {};

g.getSnapshotIds(data.gId, data.userId)
    .then(function(value) {
        gData = value;
        for ( var snapshot in value ) {
            var snapshotId = value[snapshot].snapshotId;
            var snapshot = {};
            g.getSnapshotFull(snapshotId)
                .then(function(value) {
                    console.log(value);
                    return g.getTs(snapshotId);
                })
                .then(function(value) {
                    for ( var te in value ) {
                        var name = value[te].t;
                        snapshot[name] = value[te].value;
                    }
                    console.log(snapshot);
                })
                .catch(function(err) {
                    console.log('Error:', err);
                });
        }
        g.close();
    })
    .catch(function(err) {
        console.log('Error:', err);
    });

1 个答案:

答案 0 :(得分:1)

问题是for循环是同步的,而promise是异步的。发生的事情是,您正在创建一堆正在等待某些事件发生的promise(接收数据的promise),然后for循环结束(在任何promise结束之前),然后调用close。您想要做的是与下面类似的事情。

    var gData = {};

g.getSnapshotIds(data.gId, data.userId)
.then(function (value) {
	gData = value;
	var promises = [];
	for (var snapshot in value) {
		var snapshotId = value[snapshot].snapshotId;
		var snapshot = {};
		var promise = g.getSnapshotFull(snapshotId)
			.then(function (value) {
				console.log(value);
				return g.getTs(snapshotId);
			})
			.then(function (value) {
				for (var te in value) {
					var name = value[te].t;
					snapshot[name] = value[te].value;
				}
				console.log(snapshot);
			});
		promises.push(promise);
	}
	return Promise.all(promises);
})
.then(function (values) {
   g.close();
	console.log(values);
})
.catch(function (err) {
	console.log('Error:', err);
});

解决此问题的方法是保存承诺,然后使用Promise.all(promises)等待所有承诺完成。然后,最后一个块将具有所有promise的结果,您可以在其中关闭数据库连接。