异步调用问题,封装调用系统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; 
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.
  • 63.
  • 64.
  • 65.
  • 66.
  • 67.
  • 68.
  • 69.
  • 70.
  • 71.
  • 72.
分享
微博
QQ
微信
回复
2024-06-04 21:41:53


相关问题
HarmonyOS 文件Hash处理
1292浏览 • 1回复 待解决
HarmonyOS Hash方法
813浏览 • 1回复 待解决
taskpool异步任务支持串行处理方法
1836浏览 • 1回复 待解决
HarmonyOS Image组件能调用异步方法吗?
874浏览 • 1回复 待解决
鸿蒙应用如何处理异步请求?
971浏览 • 0回复 待解决
webview的oninterceptrequest中调用异步操作
2624浏览 • 1回复 待解决
鸿蒙开发中如何处理异步操作?
362浏览 • 0回复 待解决
如何处理异步弹窗的显示方式
325浏览 • 0回复 待解决