更新:添加了Deck.NET示例https://deck.net/d6ad74332cfdee1293a535daf5afc144
我正在使用ImmortalDB,它返回一个承诺:https://github.com/gruns/ImmortalDB#get,如下所示:
public class OzCrGbSearchParameterDataManagerData
{
private const string KEY_PREFIX = "OzCrGbSearchParameterDataManagerData"; //Avoid potential key name collisions
private const int UNSET_ID = -111; //This is the same as OzCpPlatformConstants.UNSET_ID
private const string IMMORTAL_DATABASE_NAME = "dbSearchParameterData";
public OzCrGbSearchParameterDataManagerData()
{
Console.WriteLine("OzCrGbSearchParameterDataManagerData Constructor");
}
/// <summary>
/// Holds the session for Departing city selected parameter
/// </summary>
public int ShipId
{
//get => Convert.ToInt32(JavaScriptGetMethod("ShipId", Convert.ToString(UNSET_ID)));
get
{
var blah = JavaScriptGetMethod("ShipId", Convert.ToString(UNSET_ID));
Console.WriteLine("Blah");
Console.WriteLine(blah);
Console.WriteLine("/Blah");
return -1;
}
set => JavaScriptSetMethod("ShipId", Convert.ToString(value));
}
private string JavaScriptGetMethod(string aKeyName, string aKeyValueDefault, string aKeyPrefix = KEY_PREFIX)
{
return Script.Write<string>("ImmortalDB.ImmortalDB.get('aKeyName', 'aKeyValueDefault')");
}
private void JavaScriptSetMethod(string aKeyName, string aKeyValue, string aKeyPrefix = KEY_PREFIX)
{
Script.Write("ImmortalDB.ImmortalDB.set('aKeyPrefix.aKeyName', 'aKeyValue');");
}
}
现在我最终看到的JS是:
很明显,我得到了一个承诺(如预期的那样),但是我无法弄清楚如何通过返回类型Task和/或它正在构建的实际JS的组合来更改JavaScriptGetMethod,以使我得到承诺的结果。
同样,我的JavaScriptSetMethod()也不起作用。
非常感谢任何指针。
答案 0 :(得分:0)
我不熟悉Bridge.NET,也不是Script.Write<T>
方法,但是我希望下面的内容至少能为您指明正确的方向,以防万一。
想像一个承诺,您从某个地方订购了一个包裹,而送货员刚被放在您手中。
您一直拿着盒子,但它并不是您感兴趣的盒子本身,而是想要它(盒子)容纳在里面的任何东西。您必须怎么做才能拿到该物品?当然要打开包装盒。
您可以通过等待或提供解决/拒绝处理程序解包 承诺。下面的两个功能展示了技术(Full Deck.NET sample)
private string JavaScriptGetMethodUnwrapPromise1(string aKeyName, string aKeyValueDefault, string aKeyPrefix = KEY_PREFIX)
{
return Script.Write<string>("(async () => { try { const res = await ImmortalDB.ImmortalDB.get('aKeyName', 'aKeyValueDefault'); return JSON.stringify(res); } catch (err) { return JSON.stringify(err); } })();");
}
上面的代码在自动执行的 async 函数中包装了对ImmortalDB.ImmortalDB.get
的调用,因为 await 关键字只能用于 async < / strong>功能。然后,它对返回值进行了字符串化处理,因为我们希望字符串不是对象。
private string JavaScriptGetMethodUnwrapPromise2(string aKeyName, string aKeyValueDefault, string aKeyPrefix = KEY_PREFIX) {
return Script.Write<string>("(() => { ImmortalDB.ImmortalDB.get('aKeyName', 'aKeyValueDefault').then((res) => { return JSON.stringify(res); }).catch((err) => { return JSON.stringify(err); }); })();");
}
我们在这里实现了相同的目标,但是没有异步包装器,因为我们不是等待-兑现承诺,而是附加解决/拒绝处理程序。