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

异步回调无法返回报价列表报错,如何正确获取Offer列表?

问题:异步获取报价列表时返回值报错

我尝试从外部服务获取报价列表,相关代码如下:

触发购买方法

public void TriggerPurchase()
{
    List<string> offers = listener.GetOffers();
    Debug.Log("OFFERS " + offers[0]);
}

获取报价方法

public List<string> GetOffers()
{
    var purchases = GetComponent<Purchases>();
    purchases.GetOfferings((offerings, error) =>
    {
        if (offerings.Current != null && offerings.Current.AvailablePackages.Count != 0)
        {
            List<string> offers = new List<string>();
            foreach (var package in offerings.Current.AvailablePackages)
            {
                //Debug.Log("Package " + package);
                if (package == null) continue;

                offers.Add(package.StoreProduct.PriceString);
            }

            return offers; // 错误:匿名函数转换为返回void的委托时不能返回值
        }
    });
}

运行时出现错误提示:Anonymouse function converted to a void returning delegate cannot return a value,希望能正确获取报价列表。

更新:补充GetOfferings的实现代码:

/// <summary>
/// GetOfferings的回调委托
/// </summary>
/// <param name="offerings">请求成功时返回Offerings对象,否则为null</param>
/// <param name="error">请求失败时返回错误信息,否则为null</param>
public delegate void GetOfferingsFunc(Offerings offerings, Error error);

private GetOfferingsFunc GetOfferingsCallback { get; set; }

/// <param name="callback">获取到报价时触发的完成回调,若报价已缓存会立即调用。请求失败时Offerings为null</param>
public void GetOfferings(GetOfferingsFunc callback)
{
    GetOfferingsCallback = callback;
    _wrapper.GetOfferings();
}

解决方法

错误原因

  1. 委托返回值不匹配:GetOfferingsFunc是返回void的委托,匿名回调里尝试return offers违反了委托定义,导致报错。
  2. 异步操作误用同步返回:GetOfferings是异步方法,调用后不会立即拿到结果,GetOffers直接返回List<string>的写法根本拿不到异步请求的结果,还会引发空引用异常。

修正方案:改用回调传递异步结果

把GetOffers改成接收回调参数的形式,等异步请求完成后通过回调返回报价列表:

1. 修改GetOffers方法

// 定义回调委托,用于传递获取到的报价列表
public delegate void OffersReceivedCallback(List<string> offers, Error error);

public void GetOffers(OffersReceivedCallback callback)
{
    var purchases = GetComponent<Purchases>();
    purchases.GetOfferings((offerings, error) =>
    {
        // 先处理错误情况
        if (error != null)
        {
            callback?.Invoke(null, error);
            return;
        }

        // 处理报价数据
        List<string> offers = new List<string>();
        if (offerings?.Current != null && offerings.Current.AvailablePackages.Count > 0)
        {
            foreach (var package in offerings.Current.AvailablePackages)
            {
                if (package?.StoreProduct != null)
                {
                    offers.Add(package.StoreProduct.PriceString);
                }
            }
        }

        // 通过回调返回结果
        callback?.Invoke(offers, null);
    });
}

2. 修改TriggerPurchase方法,适配异步回调

public void TriggerPurchase()
{
    listener.GetOffers((offers, error) =>
    {
        if (error != null)
        {
            Debug.LogError("获取报价失败:" + error.Message);
            return;
        }

        if (offers != null && offers.Count > 0)
        {
            Debug.Log("OFFERS " + offers[0]);
            // 这里可以继续处理报价,比如显示UI等
        }
        else
        {
            Debug.LogWarning("没有可用报价");
        }
    });
}

关键说明

  • 异步操作不能用同步返回值的方式获取结果,必须通过回调、Task/Async-Await等异步模式处理。
  • 增加了多层空值判断,避免NullReferenceException。
  • 明确错误处理逻辑,把错误信息通过回调传递,方便上层处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 01:30:22