у меня, наверное, небольшая проблема. Вот функция, которая возвращает обещание.
export default ()=>{
const socket = io(config.crypt_compare_api_url);
let subscription = config.subscription;
socket.emit('SubAdd', { subs: subscription });
return new Promise(resolve => {
socket.on("m",resolve);
});
}
И вот я его использую. Он импортирован как get_crypto
get_crypto().then((parsedData)=>{
let el=this.state.currencies.find(element=> element.name===parsedData.name);
if (el)
{
el.price=parsedData.price;
}
else this.state.currencies.push(parsedData);
this.setState( {
currencies: this.state.currencies
});
});
** Функция 'тогда' всегда должна повторяться после того, как сокет получит сообщение. Но срабатывает только один раз, **



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


Вы не можете вспомнить, а затем выполнить обратный вызов несколько раз. Вы должны использовать наблюдаемый или просто вызвать обратный вызов для события 'm':
export const getCrypto = (cb) => {
const socket = io(config.crypt_compare_api_url);
let subscription = config.subscription;
socket.emit('SubAdd', { subs: subscription });
socket.on("m", cb);
}
import { getCrypto } from 'get-crypto.js';
getCrypto(parsedData => {
console.info(parsedData);
// Do something with parsed data
})не могли бы вы привести пример
или я могу дать вам образец
я сделал это get_crypto ((parsedData) => {let el = this.state.currencies.find (element => element.name === parsedData.name); if (el) {el.price = parsedData.price;} иначе this.state.currencies.push (parsedData); this.setState ({валюты: this.state.currencies});});
но я не думаю, что это лучшая практика
Почему это не должно быть лучшей практикой?
Вам придется снова вызвать get_crypto(), чтобы получить новое обещание, чтобы вы могли сделать что-то вроде этого:
const datahandler = function(parsedData){
let el=this.state.currencies.find(element=> element.name===parsedData.name);
if (el)
{
el.price=parsedData.price;
}
else this.state.currencies.push(parsedData);
this.setState( {
currencies: this.state.currencies
});
}
const loop = function(){
get_crypto().then(datahandler).then(loop);
}
loop();
Использование обещания не подходит для вашего варианта использования. Обещание разрешается и получает значение только один раз. Вам нужен наблюдаемый образец подобия. Вы можете показать нам, где вызывается get_crypto (). Я предполагаю, что это проект реакции, основанный на теге вопроса. Пожалуйста, разместите свой код, чтобы мы могли помочь