Не удается правильно выйти из функции

#c#

Вопрос:

У меня есть функция C# unity, и я пытаюсь запросить некоторый json с веб-сервера, но по какой-то причине он не выходит из функции там, где я хочу:

 using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Newtonsoft.Json;
using Newtonsoft.Json.Serialization;
using Proyecto26;
using UnityEditor;
using UnityEngine.Networking;
using System.Text;
using TMPro;
using SimpleJSON;

public class APIRequest
{
   // string basicRequestPage = "****";
    string basicAPI_Key = "****";
    // Start is called before the first frame update

    string outputs;


    public string basicRequest(int requestTyp)
    {


        auth test1 = new auth();

        test1.key = basicAPI_Key;


        switch (requestTyp)
        {
            case 0:
                test1.request = "deckList";
                break;
            case 1:
                test1.request = "card";
                break;

        }
        string output = JsonConvert.SerializeObject(test1);

        byte[] outputToServer = Encoding.ASCII.GetBytes(output); ;


        //Debug.Log(output);

        RestClient.Request(new RequestHelper
        {
            Uri = basicRequestPage,
            Method = "POST",
            Timeout = 10,
            //EnableDebug = true,
            ParseResponseBody = false, //Don't encode and parse downloaded data as JSONe
            BodyRaw = outputToServer
        }).Then(response =>
        {
            // EditorUtility.DisplayDialog("Status", response.Text, "Ok");
            var rest = response.Text;
            //Debug.Log(rest);
            outputs = rest.ToString();
            //EditorUtility.DisplayDialog("Status", outputs, "Ok");
            return outputs;

        }).Catch(err =>
        {
            var error = err as RequestException;
            EditorUtility.DisplayDialog("Error Response", error.Response   "", "Ok");


        }


        );


    }
}

 

Ссылка на код, потому что он не будет работать со встроенным текстом кода

Это прекрасно работает как метод, но продолжает жаловаться, что у меня нет действительного возврата от функции. Когда я пытаюсь вернуть значение, которое я получаю от API, а именно переменную outputs, она говорит, что она равна нулю. Я попытался поместить его в функцию, в общедоступную переменную. но пока безрезультатно.

Есть какие-нибудь идеи?

Комментарии:

1. В ).Catch( err => ... блоке либо создайте исключение , либо return ""; Функция в любом случае должна что-то возвращать. Не просто счастливый путь.

2. Предложение: добавьте регистр по умолчанию в инструкцию switch

Ответ №1:

Вы определили вывод типа string , однако вы не возвращаете строку при всех выходах. После catch этого вы должны вернуть строку либо в конце метода, либо в catch . Последняя строка, которую я добавил return ""; , должна решить проблему.

 public string basicRequest(int requestTyp)
{
    auth test1 = new auth();
    test1.key = basicAPI_Key;
    switch (requestTyp)
    {
        case 0:
            test1.request = "deckList";
            break;
        case 1:
            test1.request = "card";
            break;

    }
    string output = JsonConvert.SerializeObject(test1);
    byte[] outputToServer = Encoding.ASCII.GetBytes(output);

    //Debug.Log(output);

    RestClient.Request(new RequestHelper
    {
        Uri = basicRequestPage,
        Method = "POST",
        Timeout = 10,
        //EnableDebug = true,
        ParseResponseBody = false, //Don't encode and parse downloaded data as JSONe
        BodyRaw = outputToServer
    }).Then(response =>
    {
        // EditorUtility.DisplayDialog("Status", response.Text, "Ok");
        var rest = response.Text;
        //Debug.Log(rest);
        outputs = rest.ToString();
        //EditorUtility.DisplayDialog("Status", outputs, "Ok");
        return outputs;

    }).Catch(err =>
    {
        var error = err as RequestException;
        EditorUtility.DisplayDialog("Error Response", error.Response   "", "Ok");
    }
    );
    return ""; //<----- this here
}
 

Комментарии:

1. Хотя я вижу, что получаю ответ с помощью DisplayDialog, когда я добавляю то, что вы предложили, единственная строка, которую я получаю, -«», похоже, она обходит возврат, который я ввел ранее в коде.

2. добавление в catch только по-прежнему говорит, что «у вас нет действительного возврата»

3. @danielrobbins вы указываете в заголовке метода, что возвращаете строку. Таким образом, все пути выхода в методе должны определять возврат. Я предполагаю, что компилятор видит другие пути выхода, поэтому добавление возвращаемого значения «» в конце метода, как показано, должно решить эту проблему. Возврат в конце не обходит введенный вами возврат, ваш возврат никогда не будет достигнут, так как метод вернется тогда, а это означает, что вы никогда не окажетесь в . Затем расстанься. Попробуйте добавить туда точку останова и отладить, она, вероятно, не будет поражена.

4. Я добавил точку останова, и она действительно попала в возврат в функции ответа. Я верю. По какой-то причине кажется, что сначала выполняется нижний возврат, затем правильный возврат, и именно поэтому я получаю нулевое значение. Может быть, это потому, что он не ждет ответа первым?