当前位置: 首页 > 知识库问答 >
问题:

试图在Reactjs中实现一个简单的promise

江德海
2023-03-14

这是我第一次尝试做出promise。我有一个工作的基本promise(从别人的代码中剽窃),但不知道如何调整它以使其有用。

到目前为止我所拥有的(在我的render()函数中)

  var promise = new Promise( (resolve, reject) => {

     let name = 'Dave'

     if (name === 'Dave') {
        resolve("Promise resolved successfully");
     }
     else {
        reject(Error("Promise rejected"));
     }
  });

  promise.then(function(result) {
     console.log(result); // "Promise resolved successfully"
  }, err => {
     console.log(err); // Error: "Promise rejected"
  });

果然,由于promise条件匹配(name===“Dave”),我的控制台日志promise已成功解析。

然而,我不知道在使用promise时如何给变量赋值。例如:

  promise.then(function(result) {
     var newName = 'Bob'
  }, function(err) {
     var newName = 'Anonymous'
  });

然后,当我尝试返回这个值在渲染()的返回语句,像这样:

<h2>{newName}</h2>

它说newName是未定义的。

我也尝试过:

  promise.then(function(result) {
     var newName = result
  }, function(err) {
     var newName = error
  });

…预期这会将resolveerror字符串分配到newName变量中,但不是。

我是不是想错了?当我的条件满足时,如何使它比只记录字符串更有用?

任何帮助都将不胜感激,因为这真的让我头疼。。。

 render() {

      var promise = new Promise( (resolve, reject) => {

         let name = 'Paul'

         if (name === 'Paul') {
            resolve("Promise resolved successfully");
         }
         else {
            reject(Error("Promise rejected"));
         }
      });

      let obj = {newName: ''};

      promise.then( result => {
         obj["newName"] = result
      }, function(error) {
         obj["newName"] = error
      });

      console.log(obj.newName)

    return (
      <div className="App">
         <h1>Hello World</h1>
         <h2>{obj.newName}</h2>
      </div>
    );
  }

共有2个答案

阎辰钊
2023-03-14
匿名用户

你需要考虑你所处的范围。当你在传递给promise的函数中时,,你在一个新的块作用域中,因此你在函数中创建的任何变量都不会存在于它的作用域之外。我不确定如何定义React组件,但假设组件上有一个newName变量,有两种方法可以解决范围问题—绑定和箭头函数:

promise.then(function(result) {
  this.newName = result; //or what you want to assign it to
}.bind(this))

然后您可以使用{this.newName}

或具有箭头功能:

promise.then((result) => {
  this.newName = result; //or what you want to assign it to
}.bind(this))

我建议您观看此egghead视频,以帮助您理解javascript中的this关键字。

麻茂材
2023-03-14

您正在以错误的方式使用React。一个Promise被设计为在稍后的时间点返回结果。当您的promise得到解决拒绝时,您的呈现将已完成执行,并且在promise完成时不会更新。

render方法应仅依赖props和/或state来呈现所需的输出。对prop状态的任何更改都将重新呈现组件。

>

  • 首先,确定您的Promise在组件的生命周期中应该去哪里(这里)
  • 在你的情况下,我会做以下事情

    >

  • 初始化构造函数(ES6)内部的状态,或者通过get初始状态

    constructor(props) {
      super(props);
      this.state = {
        name: '',
      };
    }
    

    然后在componentWillMountcomponentDidMount上,如果您觉得合适,请在那里调用promise

    componentWillMount() {
     var promise = new Promise( (resolve, reject) => {
    
      let name = 'Paul'
    
      if (name === 'Paul') {
       resolve("Promise resolved successfully");
      }
      else {
       reject(Error("Promise rejected"));
      }
     });
    
     let obj = {newName: ''};
    
     promise.then( result => {
      this.setState({name: result});
     }, function(error) {
      this.setState({name: error});
     });
    }
    

    然后在render方法中编写类似的代码

    render() {
     return (
      <div className="App">
       <h1>Hello World</h1>
       <h2>{this.state.name}</h2>
      </div>
     );
    }
    

  •  类似资料:
    • 本文向大家介绍jQuery实现一个简单的轮播图,包括了jQuery实现一个简单的轮播图的使用技巧和注意事项,需要的朋友参考一下 html代码: css代码: js代码: 以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持呐喊教程!

    • 本文向大家介绍如何简单的实现一个promise?相关面试题,主要包含被问及如何简单的实现一个promise?时的应答技巧和注意事项,需要的朋友参考一下 参考回答: 首先明确什么是promiseA+规范,参考规范的地址:primise A+规范 如何实现一个promise,参考我的文章: 实现一个完美符合Promise/A+规范的Promise 一般不会问的很详细,只要能写出上述文章中的v1.0版本

    • 我正试图用Java编写一个非常简单的merkle树实现。 我使用比特币区块链上方框170中的TXID值作为参考,因此我可以看到正确的结果。 与该块对应的TXID如下所示: 据我了解,比特币的merkle树实现方式如下: 将块中的事务拆分为成对的事务 有一个警告是: 我的代码在一个开关语句中,它看起来像这样: 我编写的swapEndianness方法不是真正的“字节级”交换,而是更改字符串的顺序,如

    • 本文向大家介绍如何实现Java中一个简单的LinkedList,包括了如何实现Java中一个简单的LinkedList的使用技巧和注意事项,需要的朋友参考一下 LinkedList与ArrayList都是List接口的具体实现类。LinkedList与ArrayList在功能上也是大体一致,但是因为两者具体的实现方式不一致,所以在进行一些相同操作的时候,其效率也是有差别的。 对于抽象的数据结构——

    • 我是使用Dagger2的新手(我一直使用Koin),我正在尝试实现一个简单的示例,但我真的不知道我缺少了什么。这就是我目前得到的。 app.gradle: 应用模块。kt: AppComponent。kt: TestClass。千吨 pp.kt: MainActivity.kt: 错误:testClass==null

    • 本文向大家介绍使用wxpython实现的一个简单图片浏览器实例,包括了使用wxpython实现的一个简单图片浏览器实例的使用技巧和注意事项,需要的朋友参考一下 上次我爬了n多图片,但是浏览的时候有一个问题。 图片浏览器的浏览一般都是按名称排的,而我对图片的命名是按照数字递增的。比如3总是会排在10后面,也就无法快速地浏览图片了。 所以,出于方便自己查阅图片,也出于学习,决定做一个自己的图片浏览器。