我正在尝试遍历JSON对象数组( var requestArray = req.body;
,特别是requestArray['filter']
),以将每个对象持久化到数据库中。每次保留之后,我提取最后一个保留的数据表,并将其添加到let responseDataArray = [];
中的数组 responseDataArray.push(result);
中。然后将此数组作为请求响应返回。
app.post('/sound', function (req, res) {
var requestArray = req.body;
let responseDataArray = [];
for (var i = 0; i < requestArray['filter'].length; i++) {
if (i > 3)
break;
var revEl = requestArray['filter'][i];
// console.log('GUID >>> ' + i + ' : ' + revEl['_revEntityGUID'] + ' >>> ' + JSON.stringify(revEl));
persistSingleItemPromise(revEl).then(function (result) {
responseDataArray.push(result);
console.log(JSON.stringify(responseDataArray));
});
}
console.log((responseDataArray));
res.send(responseDataArray);
});
问题出在for loop
中。它会延迟,我只返回一个空数组responseDataArray = []
,因为它在迭代完成之前就返回了。
我尝试使用 Promose persistSingleItemPromise
:
let persistSingleItemPromise = function (revData) {
return new Promise(function (resolve, reject) {
revPersSaveRevEntity.revPersSaveRevEntity(revData, function (result) {
resolve(result);
});
});
};
这没有帮助。我该如何解决?
谢谢大家。
答案 0 :(得分:2)
我在想这样的事情。
没有测试过,请让我知道它是否有效;-)
请记住,您的回调也需要异步前缀。
const resultPromise = requestArray['filter'].reduce( async ( accPromise, revEl ) => {
const acc = await accPromise
const result = await persistSingleItemPromise(revEl)
acc.push( result )
return result
}, Promise.resolve( [] ) )
const responseDataArray = await resultPromise
答案 1 :(得分:1)
您可以使用Promise.all
并存储承诺。然后,等待所有人解决
喜欢
app.post("/sound", function(req, res) {
var requestArray = req.body;
let responsePromises = [];
for (var i = 0; i < requestArray["filter"].length; i++) {
if (i > 3) break;
var revEl = requestArray["filter"][i];
// console.log('GUID >>> ' + i + ' : ' + revEl['_revEntityGUID'] + ' >>> ' + JSON.stringify(revEl));
responsePromises.push(persistSingleItemPromise(revEl));
}
Promise.all(responsePromises).then(result => res.send(result));
});
这里有一个模拟示例
const promises = [];
for (let i = 1; i < 4; i++) {
promises.push(new Promise(resolve => {
// Simulate asynchronous request
setTimeout(() => {
resolve("Resolved " + i);
}, 100 * i);
}));
}
// Notice how the result takes some time.
// It's basically waiting for all the promises to resolve
Promise.all(promises).then(results => console.log(results));
答案 2 :(得分:0)
我认为您应该将“ persistSingleItemPromise”中的所有promise添加到数组中,并对它们执行Promise.All(list).then(),然后等待结果返回。