无论如何在同一个函数中运行特定等待操作之前的其他操作?

问题描述 投票:0回答:1
await ipfs.files.add(this.state.file, (err,result) => {
      if(err){
        console.log(err);
        return
      }
    console.log('profile hash ' + result[0].hash);
    this.setState({profilePic : result[0].hash , continue : true});
    });
    this.setState({loading : true,visible : 'true'});

    console.log('gender value is ' + this.state.gender);
    const accounts = await web3.eth.getAccounts();
    console.log( 'the value of profilepic is ' + this.state.profilePic);

      if(this.state.profilePic == '')
      {
        console.log('waiting');
      }else{
        try{
          this.setState({continue : false});
          console.log('profile hash again ' + this.state.profilePic);
          await Patient.methods.insertPatient(
                accounts[0],
                this.state.surname,this.state.givenname,
                this.state.gender,this.state.age,
                this.state.email,this.state.language,
                this.state.nationality,this.state.phone,
                this.state.medicalno,this.state.profilePic)
                .send({
                  from : accounts[0],
                });
        }
       catch (e) {
        console.log(e);

      } finally {
        this.setState({loading : false,visible : 'false'});
      }
    }

我有这个等待ipfs add文件先运行然后第二个await获取第一个await的结果然后继续。我希望第二个等待等待第一个等待还没有完成,谢谢

javascript reactjs async-await
1个回答
0
投票

为了让await产生任何有意义的效果,你需要等待一个承诺。如果您等待非承诺,它不会抛出任何异常,但它也不会延迟转移到下一个代码。

要获取使用回调编写的代码并将其转换为承诺,您需要将其包装在新的承诺中。对于您的情况,这可能看起来像这样:

await new Promise((resolve, reject) => {
  ipfs.files.add(this.state.file, (err,result) => {
    if(err){
      reject(err);
      return;
    }
    console.log('profile hash ' + result[0].hash);
    this.setState({profilePic : result[0].hash , continue : true});
    resolve(result);
  });
});

现在您正在等待一个承诺,此异步函数的执行将暂停,直到该承诺得到解决。稍后在异步函数中的代码将不会运行。

如果您正在对ipfs.files.add进行大量调用,那么您可能需要创建一个辅助函数来为您创建承诺。如:

function add(file) {
  return new Promise((resolve, reject) => {
    ipfs.files.add(file, (err, result) => {
      if (err) { 
        reject(err);
      } else {
        resolve(result);
      }
    });
  }
}

// to be used as:
const result = await add(this.state.file);
console.log('profile hash ' + result[0].hash);
this.setState({profilePic : result[0].hash , continue : true});
© www.soinside.com 2019 - 2024. All rights reserved.