setDeviceTimeout = id => timeout => {
const {onSetDevices, devices} = this.props;
var newDeviceList = devices.map(device => {
if (device.id === id) {
var newDevice = {
//...device,
timeout: timeout
};
deviceTable.oncePostDevice(newDevice).then( data => {
return newDevice = data
});
}
return device;
});
onSetDevices(newDeviceList);
}
Итак, проблема, с которой я столкнулся, заключается в том, что onSetDevices(newDeviceList) вызывается до завершения работы devices.map(). Это связано с тем, что devices.map() обращается к серверу oncePostDevice(newDevice), затем возвращает данные, сохраняет их в переменной newDevice и помещает их в массив newDeviceList.
Поскольку это происходит, onSetDevices не включает newDevice в массив объектов newDeviceList, и когда я устанавливаю свое состояние редукции с помощью onSetDevices, ничего не изменилось.
Мне интересно, как я могу превратить это в асинхронный, Ждите или использовать только обещать, чтобы завершить задачу, заставляющую onSetDevices ждать завершения devices.map().
Также вот код для oncePostDevice:
export const oncePostDevice = (device) => new Promise(function(resolve, reject) {
fetch('https://url/devices/'+device.id, {
method: 'PUT',
headers: {
"Accept": "application/json",
"Content-Type": "application/json"
},
body: JSON.stringify(device)
})
.then(response => response.json())
.then(
data => {return resolve(data)},
error => {return reject(error)}
)
.catch(err => console.error(this.props.url, err.toString()));
});
Как видите, у меня уже есть обещать, работающий и возвращающий данные впоследствии.
Мне просто нужно знать, как завершить работу моей функции внутреннего сопоставления setDeviceTimeout, прежде чем я нажму на onSetDevices.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вот как это можно сделать (пояснения в коде):
// make the function async
setDeviceTimeout = id => async timeout => {
const {onSetDevices, devices} = this.props;
// make a list of promises, not of devices
// note: mapping a value via an async function will create promises
const newDeviceListPromises = devices.map(async device => {
if (device.id === id) {
const newDevice = {
...device,
timeout: timeout
};
return await deviceTable.oncePostDevice(newDevice);
}
return device;
});
// wait for all promises to finish and what they return will be the devices
const newDeviceList = await Promise.all(newDeviceListPromises);
onSetDevices(newDeviceList);
};
Идеально!!! Спасибо, сэр! Это сработало как шарм, я действительно не могу вас отблагодарить, я ломал себе голову, пытаясь решить эту проблему.