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的结果然后继续。我希望第二个等待等待第一个等待还没有完成,谢谢
为了让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});