我遇到了从queryArray捕获每个id并将其与return promise结果一起存储的问题。
getSavedQueries: function(req, res) {
SPromise.then(function(client) {
const SavedQuery = client.Reports;
var queryArray = req.query.queryArray; // ['123', '234', '456']
var payloadObj = {};
var actions = lo.map(queryArray, function(id) {
var queryID = Number(id);
*payloadObj['ID'] = queryID;* <--- not sure where to put this
return SavedQuery.findOne(queryID).then(function(result){
payloadObj['query'] = result;
return payloadObj
});
});
return Promise.all(actions);
}).then(function(result){
return res.json(result)
});
}
我的res.json(result)返回所有三个对象的数组的最后一项:
[ {ID: 456, query: ...},
{ID: 456, query: ...},
{ID: 456, query: ...}]
而不是:
[ {ID: 123, query: ...},
{ID: 234, query: ...},
{ID: 456, query: ...}]
答案 0 :(得分:3)
问题是payloadObj
是在地图回调之外定义的。因此,同一个对象在map回调期间发生变异,并从地图回调中创建的promise上调用的then
方法返回,因此传递给Promise.all
的数组包含3个promise all解析为同一个对象,其ID
属性将是数组中的最后一个ID(因为此地图回调最后被调用)并且其query
属性将是结果成功的最后一个请求(可能,但不一定是最后一个请求)。