promise.all() 的返回结果未捕获作用域变量
returned results from promise.all() does not capture scoped variable
我在从 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)
});
}
my res.json(result) returns 所有三个对象的数组中的最后一项:
[ {ID: 456, query: ...},
{ID: 456, query: ...},
{ID: 456, query: ...}]
而不是:
[ {ID: 123, query: ...},
{ID: 234, query: ...},
{ID: 456, query: ...}]
问题是 payloadObj
是在地图回调之外定义的。因此,同一对象在映射回调期间发生变异,并从在映射回调中创建的承诺上调用的 then
方法返回,因此传递给 Promise.all
的数组包含 3 个承诺全部解析为 相同的对象 ,其 ID
属性 将是数组中的最后一个 ID(因为此映射回调是最后调用的)并且其 query
属性 将是最后一次成功请求的结果(可能但不一定是最后一次请求)。
我在从 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)
});
}
my res.json(result) returns 所有三个对象的数组中的最后一项:
[ {ID: 456, query: ...},
{ID: 456, query: ...},
{ID: 456, query: ...}]
而不是:
[ {ID: 123, query: ...},
{ID: 234, query: ...},
{ID: 456, query: ...}]
问题是 payloadObj
是在地图回调之外定义的。因此,同一对象在映射回调期间发生变异,并从在映射回调中创建的承诺上调用的 then
方法返回,因此传递给 Promise.all
的数组包含 3 个承诺全部解析为 相同的对象 ,其 ID
属性 将是数组中的最后一个 ID(因为此映射回调是最后调用的)并且其 query
属性 将是最后一次成功请求的结果(可能但不一定是最后一次请求)。