Рекурсивный Coroutine-начинается с RestSharp останавливается на первом обратном вызове, который запускает другую сопрограмму того же - PullRequest
0 голосов
/ 24 января 2019

Я использовал UnityWebRequest для вызовов REST через Unity, но для определенного проекта мне пришлось выбрать другой вариант и начать тестирование RestSharp для Unity (https://github.com/llamazoo/RestSharp-for-unity3d).

Приложение содержит множество APIвызовов, поэтому я создал один статический класс со статическим IEnumerator для отправки запросов и выполнения обратного вызова к классу monobehaviour, который запустил сопрограмму.

Есть несколько методов, которые запускают сопрограмму запроса API, получаютотвечает и выполняет обратный вызов, который снова запускает другую сопрограмму того же IEnumerator. Все это хорошо работает с UnityWebRequests.

Я попытался сделать то же самое с RestSharp, добавив выход в Async Execute запроса API.Первый вызов API (скажем, для конечной точки-1) работает хорошо, получает ответ и выполняет обратный вызов с данными из конечной точки-1 в качестве параметра. Метод обратного вызова форматирует данные и вызывает тот же RestSharp IEnumarator с новыми данными для конечной точки-2. Здесьстатический метод выходит из метода так же, как и сопрограмма.(Который допускает только один вызов API с ответом в секунду)

Ниже приведен мой статический класс

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using RestSharp;
using System.Net;

public static class RestSharpUtil
{
    public static IEnumerator request_routine_POST(string url,string json, System.Action<string> callback, System.Action<string> failCallback=null){
        Debug.Log("Request :  "+json);


        RestClient w = new RestClient(url);
        RestRequest request = new RestRequest(Method.POST);



        request.AddHeader("Content-Type", "application/json");
        request.AddHeader("Accept", "application/json");

        request.Parameters.Clear();

        request.AddParameter("application/json", json, ParameterType.RequestBody);

        yield return w.ExecuteAsync(request,(response,AsyncHandler)=> {

            if(response.StatusCode == HttpStatusCode.OK || response.StatusCode == HttpStatusCode.Created || response.StatusCode == HttpStatusCode.Accepted){
                Debug.Log("Success!-> " + response.Content);

                callback(response.Content);
                Debug.Log("After Request");

            }else{

                LoadingPanel.ShowError("Something went wrong, Try again!");


            }
        });

        Debug.Log("Action Complete");
    }
}

А ниже приведены мои методы (основной и обратный вызов)

public void test(){

       string customerdata= "json1";

       StartCoroutine(RestSharpUtil.request_routine_POST(endpoint-1, customerdata, OnResponse));

 }

void OnResponse(string res){

        string otherdata = "some processed data with res";

        StartCoroutine(RestSharpUtil.request_routine_POST(endpoint-2, otherdata, OnResponse2));

}

OnResponse2 - это просто пустой метод для отображения содержимого.Однако выполнение сопрограммы в OnResponse печатает предыдущий запрос, а не новый.

Мой результат:

Request : json1
Action Complete
Success -> response
Success -> response

Он никогда не печатает «Действие завершено» или «После запроса».».Что я тут не так делаю?

...