如何在承诺中设置内部的状态for循环[复制]

问题描述 投票:0回答:1

这个问题已经在这里有一个答案:

我有一个状态this.state = { PathBased : [] , ...ect}和包含一个for循环,循环this.state.data后,我想补充的for循环PathBased状态,我无法找到如何做到这一点每一个返回元素的功能,能否请你顺便帮

console.log(this.state.data)输出是5

async readFromLocal (){
        let dirs = RNFetchBlob.fs.dirs;
        let path = [];
         let leng = this.state.data.length;
          if(leng > 0)
          {
         for( var j = 0 ; j < leng; j++)
         {
          path[j] = dirs.PictureDir+"/folder/"+this.state.data[j].title;

            const xhr = RNFetchBlob.fs.readFile(path[j], 'base64')
            .then ((data) => {this.setState({PathBased:[...PathBased,data]})})
            .catch ((e) => {e.message});
       }

      }
    console.log(this.state.PathBased.length) // output = 0
    }
javascript reactjs react-native
1个回答
0
投票

你可以利用Promise.all,并设置在PathBased状态的最终结果。此外,由于是的setState异步您需要检查的setState回调更新的状态。

async readFromLocal (){
    let dirs = RNFetchBlob.fs.dirs;
    let path = [];
    let promises = [];
    let leng = this.state.data.length;
    if(leng > 0) {
       for( let j = 0 ; j < leng; j++) {
          path[j] = dirs.PictureDir+"/folder/"+this.state.data[j].title;
          promises.push(RNFetchBlob.fs.readFile(path[j], 'base64'))
       }
    }
    Promise.all(promises)
        .then(data => this.setState({PathBased: data}, () => {console.log(this.state.PathBased)})
        )
        .catch(e => {console.log(e.message)});   
}
© www.soinside.com 2019 - 2024. All rights reserved.