Javascript 从承诺返回值(然后)

Javascript 从承诺返回值(然后),javascript,reactjs,promise,Javascript,Reactjs,Promise,我很难从承诺中返回一些价值观 这是我的代码: getInitialState: function() { var me = this; var promise = me.getChosenProtocols(); return (promise.then(function(value) { var ChosenProtocols = Object.keys(value).map(key => value[key]); return ({ showModal:

我很难从承诺中返回一些价值观

这是我的代码:

getInitialState: function() {
 var me = this;
 var promise = me.getChosenProtocols();

 return (promise.then(function(value) {
   var ChosenProtocols = Object.keys(value).map(key => value[key]);
   return ({
     showModal: (ChosenProtocols.length == 0) ? true : false,
     SelectedProtocols: ChosenProtocols,
     nmTitle: SE.t(218997)
   });
   }, function (value) {
     return({
     showModal: true,
     SelectedProtocols: [],
     nmTitle: SE.t(218997)
   });
 }));
},
所以发生的事情是,getChosenProtocols返回一个已解决的承诺,我正试图从中返回值。
任何帮助都将不胜感激

谢谢大家,当我把它改成这样时,它起了作用:

getInitialState: function() {
    var me = this;

    return ({
            showModal: false,
            SelectedProtocols: [],
            nmTitle: SE.t(218997)
    });
},

componentWillMount: function() {
    var me = this; 
    var promise = me.getChosenProtocols();

    promise.then(function(value) {
        var selectedProtocols = Object.keys(value).map(key => value[key]);

        me.setState({
            showModal: (selectedProtocols.length == 0 ) ? true : false,
            SelectedProtocols: selectedProtocols
        })
    });
},

您不应该在
getInitialState
中执行异步操作,您可以在componentWillMount或componentDidMount中执行
setState
。除此之外,我强烈建议使用ES6类

getInitialState: function() {
  return {chosenProtocols: {}};
},
componentDidMount: function() {
  var protocolsPromise = this.getChosenProtocols();
  protocolsPromise.then((value) => {
    var chosenProtocols = Object.keys(value).map(key => value[key]);
    this.setState({chosenProtocols: chosenProtocols});
  })
}
ES6版本

class ComponentName extends React.Component {
  constructor(props) {
    super(props);
    this.getChosenProtocols = this.getChosenProtocols(bind);
    this.state = {chosenProtocols: {}};
  }


  componentWillUnmount() {
    var protocolsPromise = this.getChosenProtocols();
    protocolsPromise.then((value) => {
      var chosenProtocols = Object.keys(value).map(key => value[key]);
      this.setState({chosenProtocols: chosenProtocols});
    });
  }

  getChosenProtocols() {
    // Returns a promise
  }
}

您不应该在
getInitialState
中执行异步操作,您可以在componentWillMount或componentDidMount中执行
setState
。除此之外,我强烈建议使用ES6类

getInitialState: function() {
  return {chosenProtocols: {}};
},
componentDidMount: function() {
  var protocolsPromise = this.getChosenProtocols();
  protocolsPromise.then((value) => {
    var chosenProtocols = Object.keys(value).map(key => value[key]);
    this.setState({chosenProtocols: chosenProtocols});
  })
}
ES6版本

class ComponentName extends React.Component {
  constructor(props) {
    super(props);
    this.getChosenProtocols = this.getChosenProtocols(bind);
    this.state = {chosenProtocols: {}};
  }


  componentWillUnmount() {
    var protocolsPromise = this.getChosenProtocols();
    protocolsPromise.then((value) => {
      var chosenProtocols = Object.keys(value).map(key => value[key]);
      this.setState({chosenProtocols: chosenProtocols});
    });
  }

  getChosenProtocols() {
    // Returns a promise
  }
}

你所做的承诺看起来基本上是正确的。问题似乎在于您希望将承诺的值返回到哪里。看起来您希望基于承诺在React组件中设置初始值。如果是这种情况,请创建一个函数来返回承诺中的值,然后将变量设置为该函数的输出。也就是说,在
setInitialState
中执行此操作不是推荐的位置<代码>组件将挂载或
组件挂载
更合适

如果
me.getChosenProtocals
正在返回已解析的承诺,则提供给
then()
的第一个函数将把承诺返回的值作为变量
值传递给它

大致如下:

getInitialState: function() {
  return(
    SelectedProtocols: null
  )
}

componentWillMount: function() {
  const me = this; 

  me.getChosenProtocols = new Promise((resolve, reject) => {
    setTimeout(function(){
      resolve("Success!");
    }, 250);
  });

  me.getChosenProtocols.then(function(value) {
    var selectedProtocols = Object.keys(value).map(key => value[key]);
    me.setState({
      SelectedProtocols: selectedProtocols
    })
  })
}

你所做的承诺看起来基本上是正确的。问题似乎在于您希望将承诺的值返回到哪里。看起来您希望基于承诺在React组件中设置初始值。如果是这种情况,请创建一个函数来返回承诺中的值,然后将变量设置为该函数的输出。也就是说,在
setInitialState
中执行此操作不是推荐的位置<代码>组件将挂载
组件挂载
更合适

如果
me.getChosenProtocals
正在返回已解析的承诺,则提供给
then()
的第一个函数将把承诺返回的值作为变量
值传递给它

大致如下:

getInitialState: function() {
  return(
    SelectedProtocols: null
  )
}

componentWillMount: function() {
  const me = this; 

  me.getChosenProtocols = new Promise((resolve, reject) => {
    setTimeout(function(){
      resolve("Success!");
    }, 250);
  });

  me.getChosenProtocols.then(function(value) {
    var selectedProtocols = Object.keys(value).map(key => value[key]);
    me.setState({
      SelectedProtocols: selectedProtocols
    })
  })
}

您希望将承诺中的值返回到哪里?进入变量?是的,进入SelectedProtocols,这是一种状态。我想将承诺结果设置为SelectedProtocols状态。您想将承诺中的值返回到哪里?进入变量?是的,进入SelectedProtocols,这是一种状态。我想将承诺结果设置为SelectedProtocols状态。我会将其更改为componentWillMount,无论如何,我该怎么做?我更新了答案,请检查。您也可以查看此链接谢谢您的帮助,非常感谢我将其更改为componentWillMount,不管怎样,我可以怎么做?我更新了我的答案,请检查。您也可以查看此链接谢谢您的帮助,非常感谢。谢谢,它按照您的建议设置了内部状态。谢谢,它按照您的建议设置了内部状态。