You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React Native中SHA256签名值无法获取及setState问题求助

问题分析与解决方案

嘿,我一眼就看出问题出在异步代码的执行顺序上,咱们一步步理清楚:

核心问题:异步操作的执行时机

你调用的sha256()是一个异步函数,它的.then()回调会在哈希计算完成后才执行;但你在.then()外面的ToastAndroid.show是同步执行的——这时候哈希还没生成,setState也还没触发,自然拿不到最新的hashSignature值。

另外,虽然你把_onSendSignature标记成了async,但你并没有用await等待sha256()的结果,导致函数直接跳到后面的Toast代码,完全没等异步操作完成。

解决方案1:用await替代.then()(更简洁的异步写法)

既然已经用了async函数,不如彻底用await来处理异步逻辑,让代码按顺序执行:

_onSendSignature = async () => {
    const BarcodeNo = this.state.BarcodeNo;
    const valueToHash = MerchantKey + BarcodeNo + Amount.replace('.', '').replace(',', '');
    
    // 等待sha256计算完成,拿到哈希值
    const hash = await sha256(valueToHash);
    
    ToastAndroid.show('Signature: ' + hash, ToastAndroid.LONG, ToastAndroid.BOTTOM);
    
    // React的setState是异步的,用回调函数确保state更新后再读取
    this.setState({ hashSignature: hash }, () => {
        ToastAndroid.show('Signature: ' + this.state.hashSignature, ToastAndroid.LONG, ToastAndroid.BOTTOM);
    });
}

解决方案2:保留.then(),但把依赖代码放进回调里

如果你更习惯用.then()的写法,一定要把所有依赖哈希值的操作(包括获取更新后的state)放到.then()内部,并且利用setState的第二个回调来确保state已经更新:

_onSendSignature = async () => {
    const BarcodeNo = this.state.BarcodeNo;
    const valueToHash = MerchantKey + BarcodeNo + Amount.replace('.', '').replace(',', '');
    
    sha256(valueToHash).then(hash => {
        ToastAndroid.show('Signature: ' + hash, ToastAndroid.LONG, ToastAndroid.BOTTOM);
        
        // 用setState的回调函数,保证state更新后再读取
        this.setState({ hashSignature: hash }, () => {
            ToastAndroid.show('Signature: ' + this.state.hashSignature, ToastAndroid.LONG, ToastAndroid.BOTTOM);
        });
    });
}

额外提醒:React setState的异步性

哪怕你在.then()里直接写this.state.hashSignature,也可能拿不到最新值——因为React的setState本身是异步批量更新的。所以必须通过setState的第二个回调函数,或者在componentDidUpdate生命周期里去读取更新后的state。

内容的提问来源于stack exchange,提问作者Luiey

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 07:07:57