使用Bridge.NET时难以兑现承诺

时间:2019-10-10 09:24:18

标签: bridge.net

更新:添加了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是:

image

很明显,我得到了一个承诺(如预期的那样),但是我无法弄清楚如何通过返回类型Task和/或它正在构建的实际JS的组合来更改JavaScriptGetMethod,以使我得到承诺的结果

同样,我的JavaScriptSetMethod()也不起作用。

非常感谢任何指针。

1 个答案:

答案 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); }); })();");
    }

我们在这里实现了相同的目标,但是没有异步包装器,因为我们不是等待-兑现承诺,而是附加解决/拒绝处理程序。