Javascript回应承诺

Javascript回应承诺,javascript,reactjs,Javascript,Reactjs,我可能有点小麻烦。 这是一个返回承诺的函数 export default ()=>{ const socket = io(config.crypt_compare_api_url); let subscription = config.subscription; socket.emit('SubAdd', { subs: subscription }); return new Promise(resolve => { socket.o

我可能有点小麻烦。 这是一个返回承诺的函数

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
            });
        });

**“then”函数必须在套接字收到消息后重复执行。但它只工作一次,***

您无法回忆然后多次回调。您应该使用observable或仅调用“m”事件的回调:

export const getCrypto=(cb)=>{
const socket=io(config.crypt\u compare\u api\u url);
让subscription=config.subscription;
emit('SubAdd',{subs:subscription});
插座上的(“m”,cb);
}
从'get crypto.js'导入{getCrypto};
getCrypto(解析数据=>{
console.log(parsedData);
//对已解析的数据执行某些操作

})
您无法调用然后多次回调。您应该使用observable或仅调用“m”事件的回调:

export const getCrypto=(cb)=>{
const socket=io(config.crypt\u compare\u api\u url);
让subscription=config.subscription;
emit('SubAdd',{subs:subscription});
插座上的(“m”,cb);
}
从'get crypto.js'导入{getCrypto};
getCrypto(解析数据=>{
console.log(parsedData);
//对已解析的数据执行某些操作

})
您必须再次调用
get\u 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\u 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((parsedData)=>{let el=this.state.currences.find(element=>element.name===parsedData.name);if(el){el.price=parsedData.price;}else this.state.currences.push(parsedData);this.setState({currences:this.state.currences});});但我认为这不是最好的实践为什么不应该是最好的实践呢?你能举一些例子吗?或者我可以给你一些样本我做了这个得到加密((parsedData)=>{let el=this.state.currences.find(element=>element.name==parsedData.name);if(el){el.price=parsedData.price;}else this.state.currences.push(parsedData);this.setState({currences:this.state.currences};});但我认为这不是最佳实践为什么不应该是最佳实践?使用承诺不适合您的用例。承诺只解析和评估一次值。您需要一个类似可观察的模式。您能告诉我们从哪里获取加密()吗正在调用。我假设这是一个基于问号的react项目。请提供您的代码以便我们提供帮助。使用承诺不适合您的用例。承诺只解析和评估一次值。您需要一个类似可观察的模式。您能告诉我们从何处获取加密()吗正在调用。我假设这是一个基于问号的react项目。请提供您的代码,以便我们能够提供帮助