我正在尝试遍历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);
});
答案 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的结果,您可以在其中关闭数据库连接。