异步调用问题,封装调用系统hash方法时,由于异步处理,在hash处理前返回了结果。

封装调用系统hash方法时,由于异步处理,在hash处理前返回了结果。

HarmonyOS
2024-06-03 22:20:31
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
kraml
/** 
 
 获取 hash 调用入口 
 */ 
public async getHash() { 
  // then 方案 
  this.hashByPromise("11111111", "???") 
  .then((data) => { 
    AlertDialog.show({ message: "hash: " + baseUtil.base64Encode(data) }); 
    console.log("hash: " + baseUtil.uint8ArrayToHexStr(data)); 
  }); 
  // await 方案 
  let data: Uint8Array = await this.hashByPromise("11111111", "???"); 
  console.log("hash: " + baseUtil.uint8ArrayToHexStr(data)); 
} 
// callback 方案 
public async hashByCallback(strPlain: string, strHashAlg: string): Promise<Uint8Array> { 
  let reHash: Uint8Array = new Uint8Array(); 
  if (strPlain.length != 0) { 
  let plain: Uint8Array = baseUtil.stringToUint8Array(strPlain); 
  Logger.verbose("index", "#######finalChallenge2"); 
  reHash = await this.doHashByCallback(plain, "SHA256", (reHash: Uint8Array) => { 
  Logger.verbose("index", "#######finalChallenge5"); 
  return reHash; 
}); 
} 
return reHash; 
} 
 
//promise 用法与 callback 相差不大: 
// Promise 方案 
public async hashByPromise(strPlain: string, strHashAlg: string): Promise<Uint8Array> { 
  let reHash: Uint8Array = new Uint8Array(); 
  if (strPlain.length != 0) { 
  let plain: Uint8Array = baseUtil.stringToUint8Array(strPlain); 
  Logger.verbose("index", "#######finalChallenge2"); 
  reHash = await this.doHashByPromise(plain, "SHA256") 
  .then((reHash: Uint8Array) => { 
  Logger.verbose("index", "#######finalChallenge5"); 
  return reHash; 
}); 
} 
return reHash; 
} 
 
public async doHashByPromise(strPlain: Uint8Array, hashAlg: string): Promise<Uint8Array> { 
  Logger.verbose("index", "#######finalChallenge3"); 
  let reHash: Uint8Array = new Uint8Array([]); 
  try { 
  let md: cryptoFramework.Md = cryptoFramework.createMd(hashAlg); 
  let digestPlain: cryptoFramework.DataBlob = { data: strPlain }; 
  // 数据量较少时,可以只做一次update,将数据全部传入,接口未对入参长度做限制 
  let promiseMdUpdate = md.update(digestPlain); 
  reHash = await promiseMdUpdate.then(() => { 
    let promiseMdDigest = md.digest(); 
    return promiseMdDigest; 
  }).then(mdOutput => { 
    Logger.verbose("index", "#######finalChallenge4"); 
    // 返回计算结果 
    return mdOutput.data; 
    Logger.verbose("index", "[Promise]: MD result mdOutput: " + mdOutput.data); 
  }).catch((error: BusinessError) => { 
    Logger.error("index", "[Promise]: error: " + error.message); 
    // 返回空结果 
    return new Uint8Array([]); 
  }); 
} catch (error) { 
  let e = error as BusinessError; 
  Logger.verbose("index", "[Callback]: error code: " + e.code + ", message is: " + e.message); 
} 
return reHash; 
}
分享
微博
QQ
微信
回复
2024-06-04 21:41:53
相关问题
taskpool异步任务支持串行处理方法
878浏览 • 1回复 待解决
HarmonyOS Image组件能调用异步方法吗?
102浏览 • 1回复 待解决
webview的oninterceptrequest中调用异步操作
1920浏览 • 1回复 待解决
InnoDB为什么需要自适应的Hash索引?
2284浏览 • 1回复 待解决
Redis数据类型散列hash是什么?
2569浏览 • 1回复 待解决
@watch中使用异步方法后UI反应慢
290浏览 • 1回复 待解决
api异步方法提供同步api需求
56浏览 • 1回复 待解决
redis中Hash操作是什么?
2719浏览 • 1回复 待解决
通过API异步获取系统信息属性
296浏览 • 1回复 待解决
如何对异步方法进行插桩/替换
577浏览 • 1回复 待解决
HarmonyOS 关系型数据库api异步返回
263浏览 • 1回复 待解决