Javascript – 将以前的查询结果传递到下一个.then()

我链接查询使用knex添加额外的数据到我的JSON返回对象。 然而,我似乎无法理解为什么我不能将一个knex.query的结果传递给第二个knex查询的.then()。

码:

exports.getApps = function() { return new Promise(function(resolve, reject) { db.raw(` SELECT * FROM APPs WHERE VARAPP_PUBLIC_ACTIVE > 0 ORDER BY VARAPP_PUBLIC_ACTIVE ASC, VARAPP_NAME ASC `).then(function(results) { if (results[0].length > 0) { for (var i = 0; i < results[0].length; i++) { db.raw(` SELECT * FROM APPs_Features WHERE VARAPP_ID = ? ORDER BY VARAPP_ORDER ASC `, [results[0][i].VARAPP_ID], i) .then(function(features, currentIndex) { if (features[0].length > 0) { console.log(results[0]); console.log(features[0]); results[0][currentIndex].Features = features[0]; } else { results[0][currentIndex].Features = null; } }).catch(function(err) { console.error(err); reject(err); }); } resolve({ apps: results[0] }) } else { resolve({ error: 'No Apps Found' }) } }).catch(function(err) { console.error(err); reject(err); }); }) } 

这是我完整的代码,你可以看到我试图查询应用程序表.then()循环结果,然后查询Apps_features表,然后将function结果注入原始查询结果。 我得到一个错误,读取。

 TypeError: Cannot set property 'Features' of undefined at C:\Sites\VARNET_Vars\content\appList.js:21:40 

这取决于i价值,而不是链接。

这个周期将立即执行:

for (var i = 0; i < results[0].length; i++)

所以当内部的承诺被解决时, i将等于results[0].length 。 你可以很容易地testing它试图指定这是静态的,以检查它是否工作:

results[0][i].Features = features[0];

为了解决这个问题,你必须将当前的i传递给内部的promise调用和返回的值,以便在解决promise时不使用已经设置的最大值。

所以你可以做这样的事情:

 exports.getApps = function() { return new Promise(function(resolve, reject) { db.raw(` SELECT * FROM APPs WHERE VARAPP_PUBLIC_ACTIVE > 0 ORDER BY VARAPP_PUBLIC_ACTIVE ASC, VARAPP_NAME ASC `).then(function(results) { if (results[0].length > 0) { for (var i = 0; i < results[0].length; i++) { elaborate(i, results, reject); } resolve({ apps: results[0] }) } else { resolve({ error: 'No Apps Found' }) } }).catch(function(err) { console.error(err); reject(err); }); }) function elaborate(i, results, reject) { db.raw(` SELECT * FROM APPs_Features WHERE VARAPP_ID = ? ORDER BY VARAPP_ORDER ASC `, [results[0][i].VARAPP_ID], i) .then(function(features) { if (features[0].length > 0) { results[0][i].Features = features[0]; } else { results[0][i].Features = null; } }).catch(function(err) { console.error(err); reject(err); }); } }