Есть ли какой-либо способ запустить определенный ожидающий процесс до других в той же функции? - PullRequest
0 голосов
/ 23 апреля 2019
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'});
      }
    }

У меня есть этот файл await. Сначала запускается файл ipfs, а затем второй ожидает результат первого ожидания, а затем продолжает. Я хочу, чтобы второе ожидание подождало, если первое ожидание еще не завершено Спасибо

1 Ответ

0 голосов
/ 23 апреля 2019

Чтобы 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});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...