Конечно, вы можете и всегда должны ждать в Unity для завершения UnityWebRequest !Вы должны всегда использовать, например, Coroutine
И затем вы также можете добавить, например, временное смещение, чтобы вы не делали новый запрос прямо сейчас, но, возможно, подождите несколько секунд.
Лично я бы также добавил обратные вызовы для ответа, что делает его более гибким и многократно используемым, например:
public void MakeRepeatedRequests(string url, float timeOffset, Action<string> successCallback, Action<string> errorCallback)
{
StartCoroutine(RepeatedRequestRoutine(url, timeOffset, successCallback, errorCallback);
}
private IEnumerator RepeatedRequestRoutine(string url, float timeOffset, Action<string> successCallback, Action<string> errorCallback)
{
// No worries this still looks like a while loop (well it is ^^)
// but the yield makes sure it doesn't block Unity's UI thread
while(true)
{
// Configure your request
var request = UnityWebRequest.Post(url);
// Make the request and wait until the it has finished (has a response or timeout)
// a yield kind of tells this routine to leave, let Unity render this frame
// and continue from here in the next frame
yield return request.SendWebRequest();
if(request.isNetworkError || request.isHttpError)
{
errorCallback?.Invoke(request.error);
}
else
{
successCallback?.Invoke(request.downloadHandler.text);
}
// Now wait for the timeOffset
yield return new WaitForSeconds(timeOffset);
}
}
Теперь вы можете вызывать его, например, для ожидания через 2 секунды после последнего запроса закончено
// ...
MakeRepeatedRequests ("http://example.com", 2.0f, OnSuccess, OnError);
// ...
private void OnSuccess(string success)
{
Debug.LogFormat(this, "Nice it worked! Server said:/"{0}/"", success);
// Do something e.g. using success
}
private void OnError(string error)
{
Debug.LogFormat(this, "Oh no, request failed with \"{0}\"", error);
}
или также сделать то же самое, используя лямбда-выражения
MakeRepeatedRequests ("http://example.com", 2.0f,
success =>
{
Debug.LogFormat(this, "Nice it worked! Server said:/"{0}/"", success);
// Do something e.g. using success
},
error =>
{
Debug.LogFormat(this, "Oh no, request failed with \"{0}\"", error);
// Do something else
});
Даже если вы не хотите timeOffset
, это по крайней мере ждетчтобы каждый запрос завершался, прежде чем запускать следующий, поэтому ваш сервер должен выполнить только один запрос к БД и вернуть либо успех, либо ошибку.
В вашем случае я бы в любом случае ответил (200) успешным (потому чтоошибку следует отправлять только в том случае, если на сервере действительно была ошибка), но либо отправьте пустой string
, либо какой-либо заранее определенный, который можно проверить в Unity (что-то вроде, например, "!NO_CHANGE!"
).
, поэтому на сервересторона без альoop что-то вроде, например
results = "SELECT * FROM table_name;"
if ($_REQUEST['variable_name'] != results['variable_name']){
echo results['variable_name'];
} else {
echo "!NO_CHANGE!";
}
, чем вы могли бы позже в Unity проверить это
if(string.Equals(success, "!NO_CHANGE!")) return;