模拟异步调用

时间:2018-02-21 13:06:58

标签: javascript promise

您好我试图了解Promises如何工作以及如何模拟异步调用以用作React组件的测试。 我写了这段代码,但最后的结果是数据立即加载而不是等待延迟时间。
我在哪里做错了?
提前谢谢

import React, { Component } from 'react';

const sleep = ms => new Promise(resolve => setTimeout(resolve, ms));

export default class Test extends Component 
{
    constructor(props) {
        super(props);

        this.state = {
            data: []
        };
    }

    componentDidMount() {
        sleep(3000).then(
            this.setState({
                data: ['val1', 'val2', 'val3']
            })
        );
    }

    render() {
        return (
            <ul>
                {this.state.data.map(function(value, index){
                    return <li key={index}>{value}</li>;
                })}
            </ul>
        )
    }
}

3 个答案:

答案 0 :(得分:2)

问题是你是立即调用函数setState而不是将函数引用传递给then

您可以通过多种方式获得功能参考:一种是使用bind。改变这个:

    sleep(3000).then(
        this.setState({
            data: ['val1', 'val2', 'val3']
        })
    );

为:

    sleep(3000).then(
        this.setState.bind(this, {
            data: ['val1', 'val2', 'val3']
        })
    );

或者,您可以更明确地创建函数:

    sleep(3000).then(
        _ => this.setState({
            data: ['val1', 'val2', 'val3']
        })
    );

答案 1 :(得分:1)

const getData = () => {
  return new Promise(resolve => {
    const data = [
      {
        value: 10000000
      },
      {
        value: 20000000
      }
    ];
    setTimeout(() => {
      resolve(data);
    }, 10);
  });
};

答案 2 :(得分:0)

使用ES6,您可以使用以下内容模拟异步调用:

import React, { Component } from 'react';

const sleep = ms => new Promise(resolve => setTimeout(resolve, ms));

export default class Test extends Component 
{
  constructor(props) {
      super(props);

      this.state = {
          data: []
      };
  }

  componentDidMount() {
    const data = ['val1', 'val2', 'val3']
    this.myFunc(data)
  }

  myFunc = async (data) => {        
    await sleep(3000)  
    this.setState({ data })
  }

    render() {
        return (
            <ul>
        {this.state.data.map(function(value, index){
            return <li key={index}>{value}</li>;
        })}
      </ul>
        )
    }
}