Как вернуть переменную из функции при использовании обратного вызова?C#

Место общения программистов C#
Ответить
Anonymous
 Как вернуть переменную из функции при использовании обратного вызова?

Сообщение Anonymous »

Добрый день, дорогие коллеги.
Я пытаюсь адаптировать программу Unity Webgl для некоторой социальной сети в Интернете. Социальная сеть имеет API и интегрирован просто с Unity через JavaScript. Можно хранить пользовательские данные в переменных, которые будут храниться в социальной сети.
Я написал интерфейс на единство, которое позволяет взаимодействовать с социальной сетью, но есть проблема, которую я не могу решить.
Программа Unity использует следующий код для получения хранимых данных: < /p>

public class PlayerPrefsMapProgressManager : IMapProgressManager
{

// some code

public int LoadLevelStarsCount(int level)
{
return PlayerPrefs.GetInt(GetLevelKey(level), 0);
}
}
< /code>
Я хочу заменить функцию PlayerPrefs < /code> самостоятельно. Сеть API вызывает функцию обратного вызова с возвращенным значением. < /p>

bridge.JSStorageGet("scope", ResultStorageGet);

public void ResultStorageGet(string value)
{
Debug.Log("Got value: " + value);

}
< /code>
Когда я пытаюсь заменить в исходном коде, функция обратного вызова не может вернуть значение: < /p>
public class PlayerPrefsMapProgressManager : IMapProgressManager
{

// some code
string Data;
public JSBridgeController bridge;
public void ResultStorageGet(string value)
{
Data = value;

}

public int LoadLevelStarsCount(int level)
{
bridge.JSStorageSet("scope", "100");
// I thing should be delay here, ResultStorageGet finished later
return Data; // return empty value
}
}
< /code>
Как я могу сделать задержку, чтобы дождаться вызова функции обратного вызова, или как
могу сделать это по -другому? Идеи, примеры, ссылки. Я пробовал все, что могу. < /P>
Полный текст взаимодействия с API сайта: < /p>

// Test.cs file ****************************************

public class Test : MonoBehaviour
{
public JSBridgeController bridge;

public void ClickStoradgeGet() // click some button
{
bridge.JSStorageGet("scope", ResultStorageGet);
}
public void ResultStorageGet(string value)
{
Debug.Log("Got value: " + value);

}
public void ClickStoradgeSet() // click some button
{
bridge.JSStorageSet("scope", "100");
}

}

//JSBridgeController.cs file ***************************************************

public class JSBridgeController : MonoBehaviour
{
[DllImport("__Internal")]
public static extern void _JSStorageSet(string key, string value);
[DllImport("__Internal")]
public static extern string _JSStorageGet(string key);
// Start is called once before the first execution of Update after the MonoBehaviour is created
void Start()
{

}

// Update is called once per frame
void Update()
{

}
public void JSStorageSet(string key, string value)
{
#if !UNITY_EDITOR
_JSStorageSet(key, value);
#endif
}

public void JSStorageGet(string key, UnityAction action)
{
#if !UNITY_EDITOR
// TODO : Вместо стринга сделать отдельную структуру, в которой будет отслеживаться ошибка
_actionStorageGet = action;
_JSStorageGet(key);

#endif

}
public UnityAction _actionStorageGet;

}

// JSBridgeHandler.cs file ********************************************
public class JSBridgeHandler : MonoBehaviour
{
private JSBridgeController controller;
// Start is called once before the first execution of Update after the MonoBehaviour is created
void Start()
{
controller = this.GetComponent();
}

// Update is called once per frame
void Update()
{

}

public void ResultStorageGet(string result)
{
controller._actionStorageGet.Invoke(result);
}
}

// jsbridge.jslib file ******************************************************

mergeInto(LibraryManager.library, {
_JSStorageSet: function (str, value) {
// Deal with api
console.log(UTF8ToString(value));
},
_JSStorageGet: function (str) {
// Deal with api and callback
ss.SendMessage('JSBridge', 'ResultStorageGet', "5");
}

});

< /code>
Большое спасибо за ответ. Опция int < /code> выглядит лучше и проще.
столкнулась со следующей проблемой. Код API внутри функции _JS StorageGet выполняется асинхронно и зафиксируется после вызова возвращаемого значения , т.е. быть полученным в примере или в любом другом решении? < /p>
_JSStorageGet: function (keyPtr, fallbackValue) {

// you first need to actually read them out!
var keyString = UTF8ToString(keyPtr);

// Deal with api

myBridge.send("StorageGet", {"keys": [keyString]}).then(data => {
if (data.keys[0].value) {
console.log(JSON.parse(data.keys[0].value));
var value = JSON.parse(data.keys[0].value);
return value ; // return too early, when value is not ready yet
} else
return fallbackValue;
}
< /code>
Дополнительная информация. < /p>
Я думаю, что не объясняю свой вопрос правильно. Попробуйте еще раз. Я помещаю оповещение консоли в код: < /p>
_JSStorageGet: function (keyPtr, fallbackValue) {

// you first need to actually read them out!
var keyString = UTF8ToString(keyPtr);

// Deal with api and callback

//return fallbackValue;
console.log('_JSStorageGet complete');
return 42;
}
public static int GetInt(string key, int fallback = 0)
{
int retval;
retval = _JSStorageGet(key, fallbackValue);
Debug.Log(" GetInt: " + retval );
return retval;
}
< /code>
Если запустить GetInt IGetInt: 0
_JSStorageGet complete
< /code>
Я ожидаю < /p>
_JSStorageGet complete
GetInt: 42


Подробнее здесь: https://stackoverflow.com/questions/793 ... g-callback
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»