JD2022-TU1/main/phone_apps/JDCompanionApp/Assets/uPromise/Content/Promise.Static.cs

139 lines
No EOL
3.8 KiB
C#

using System;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Networking;
using System.Collections;
using Object = System.Object;
namespace uPromise
{
// Promise Static methods.
public partial class Promise
{
private static MonoBehaviour GlobalBehaviour
{
get { return GlobalMonoBehaviour.Instance; }
}
#region All
/// <summary>
/// Wait for all promises specified to be resolved (parallel) in order for the All Promise to be resolved, if any of them fails, it will immediately reject the promise.
/// </summary>
/// <param name="promises">Promises waiting for being resolved.</param>
/// <returns></returns>
public static Promise<object[]> All(params Promise[] promises)
{
var masterDeferred = new Deferred<object[]>();
GlobalBehaviour.StartCoroutine(All_Coroutine(masterDeferred, promises));
return masterDeferred.Promise;
}
private static IEnumerator All_Coroutine(Deferred<object[]> masterDeferred, Promise[] promises)
{
int count = 0;
var args = new object[promises.Length];
int i = 0;
foreach (var promise in promises)
{
HandleAllPromise(promise, i, args)
.Then(x =>
{
count++;
masterDeferred.Notify(count);
})
.Fail(x => masterDeferred.Reject(x));
i++; // increment iterator.
}
while (count != promises.Length && masterDeferred.State == DeferredState.Pending)
{
//Debug.Log(string.Format("UntilCoroutine Iterate! MasterDeferState={0}", masterDeferred.State));
yield return new WaitForSeconds(0.1f);
}
//Debug.Log(string.Format("All_Coroutine Complete ; Count={0} ; ArgsLength={1} ; MasterDeferredState={2} ; count != args.Length={3} ; masterDeferred.State == PromiseState.Pending={4}", count, promises.Length, masterDeferred.State, count != promises.Length, masterDeferred.State == DeferredState.Pending));
if (masterDeferred.State == DeferredState.Pending)
masterDeferred.Resolve(args);
}
// This is a helper, in order to pass the arguments in sequence according to the promises.
private static Promise HandleAllPromise(Promise promise, int index, object[] args)
{
return promise.Then(x =>
{
args[index] = x;
return x;
});
}
public static Promise<object[]> AllSequentially(params Func<Promise>[] promises)
{
var deferred = new Deferred<object[]>();
var args = new object[promises.Length];
var queue = new Queue<Func<Promise>>(promises);
HandleNext_AllSequentially(queue, deferred, args, 0);
return deferred.Promise;
}
private static void HandleNext_AllSequentially(Queue<Func<Promise>> queue, Deferred<object[]> masterDeferred, object[] args, int indexer)
{
if (queue.Count == 0)
{
masterDeferred.Resolve(args);
return;
}
var promiseFunc = queue.Dequeue();
promiseFunc()
.Then(x =>
{
args[indexer] = x;
HandleNext_AllSequentially(queue, masterDeferred, args, indexer++);
})
.Fail(x => masterDeferred.Reject(x));
}
#endregion
/// <summary>
/// Converts WWW into a promise.
/// </summary>
/// <param name="www"></param>
/// <returns></returns>
public static Promise<UnityWebRequest> AsPromise(UnityWebRequest uwr)
{
var deferred = new Deferred<UnityWebRequest>();
GlobalBehaviour.StartCoroutine(WwwAsPromise_CoroutineHandler(uwr, deferred));
return deferred.Promise;
}
private static IEnumerator WwwAsPromise_CoroutineHandler(UnityWebRequest uwr, Deferred<UnityWebRequest> deferred)
{
yield return uwr.SendWebRequest();
deferred.Resolve(uwr);
}
public static Promise Reject(object reason)
{
return PromiseFactory.StartNewDeferred(dfd =>
{
dfd.Reject(reason);
});
}
public static Promise<T> Reject<T>(object reason)
{
return PromiseFactory.StartNewDeferred<T>(dfd =>
{
dfd.Reject(reason);
});
}
}
}