Well you already use promise - see then in your code and if it's angular then then itself return deferred promise so you can do:
res.Data.map(function (val, i) {
getdetails(val.ID).then(function (data) {
tmp = JSON.parse(data);
Object.keys(tmp.Data[0]).map(function (v, j) {
val[v] = tmp.Data[0][v];
});
}, function (error) { //error callback
console.log(error)
}).then(function () {
console.log(JSON.stringify(res));
})
});
EDIT: inject service $q into your controller or service
promises = [];
res.Data.map(function (val) {
promises.push(getdetails(val.ID).then(function (data) {
tmp = JSON.parse(data);
Object.keys(tmp.Data[0]).map(function (v, j) {
val[v] = tmp.Data[0][v];
});
}, function (error) { //error callback
console.log(error)
}));
});
$q.all(promises).then(function () {
console.log(JSON.stringify(res));
});
now when all the getdetails are resolved you can console.log or do whatever you want with the data