首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Bridge.NET时难以兑现承诺

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

Stack Overflow用户
提问于 2019-10-10 09:24:18
回答 1查看 110关注 0票数 0

更新:添加了Deck.NET示例https://deck.net/d6ad74332cfdee1293a535daf5afc144

我使用的是ImmortalDB,它返回承诺:https://github.com/gruns/ImmortalDB#get,如下所示:

代码语言:javascript
复制
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()也不能工作。

任何指点都很感激。

EN

回答 1

Stack Overflow用户

发布于 2020-02-04 15:38:43

我不熟悉Bridge.NET,也不熟悉它的Script.Write<T>方法,但是我希望下面的内容至少能为您指明正确的方向,以防这仍然是一个现实。

把一个承诺想象成你从某个地方订购的包裹,送货人就在你手里。

你一直拿着盒子,但它不是你感兴趣的盒子本身,你想要它(盒子)里面的任何东西。你要怎么做才能拿到这件东西?当然,打开盒子(打开它)。

您可以通过展开--承诺的承诺--等待-ing,或者提供处理程序。下面的两个函数展示了这些技术(全Deck.NET样品)

代码语言:javascript
复制
    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); } })();");
    }

上面的代码将对ImmortalDB.ImmortalDB.get的调用封装在一个自动执行的异步函数中,因为等待关键字只能在异步函数中使用。然后它会收缩返回,因为我们想要一个字符串,而不是对象。

代码语言:javascript
复制
    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); }); })();");
    }

在这里,我们实现了同样的目标,但是没有异步包装器,因为我们不是等待-ing的承诺,而是将处理程序附加到它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58319614

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档