【问题标题】:NodeJS + EJS + Promise : page is not displayed until the promise is fulfilledNode + JS + Promise :直到promise 完成才显示页面
【发布时间】:2018-03-03 13:54:57
【问题描述】:

我从承诺中的 Web 服务检索数据并使用 EJS 显示它。问题是 HTTP 页面在承诺完成之前不会显示,这是有道理的,因为我在“then”中调用了 render。

有没有办法让 HTTP 页面不显示“数据”而在 webService 调用完成时显示“数据”?

var webService = new webService();
webService.GetData("https://somewebservice.com")
    .then( (result) =>
    {
        let options: Object = 
        {
            "data": result
        };

        this.render(req, res, "index", options);
    });

【问题讨论】:

    标签: node.js typescript promise ejs


    【解决方案1】:

    所以这可能意味着您必须重组代码。但是有一种叫做可观察的东西。这就像一个承诺,但是您订阅了它,这意味着在您进行调用后,回调函数始终会监视它并在返回某些内容时进行更新。它需要重组,但这里有一个教程链接。

    还需要注意的是,您的代码可能无论如何都需要重新构建,如果您希望以这种方式处理数据,则需要加载页面然后调用数据。

    如果这有帮助,请告诉我。

    https://medium.com/@benlesh/learning-observable-by-building-observable-d5da57405d87

    【讨论】:

    • 我尝试修改代码以让页面进行调用,但可能我不知道如何正确执行此操作。在 HTTP 页面中,我看到 [object Promise] 而不是实际结果。这里有代码:private render(req: Request, res: Response, next: NextFunction) { let options: Object = { "promiseCall": this.callPromise, }; this.render(req, res, "pages/about", options); } <div>Promise call result: <%- promiseCall().then((result) => { console.log("Result from page: " + result); return result; }) %></div> Promise 调用结果:[object Promise]
    【解决方案2】:

    我最终得到的解决方案是:

    1. 该页面在<body> 上有一个 onLoad 处理程序,它使用“$.getJSON”在我的服务器上调用 JSON API
    2. JSON API 使用 Promise 调用 Web 服务,并在最后一个“then”设置“res.json”
    3. API 响应时的 onLoad 处理程序通过设置其文本来更新 HTTP 元素。

    通过这种方式加载和显示页面,然后 onLoad 处理程序启动并处理 Web 服务并更新页面。

    但是我希望所有这些都是透明的,如果 EJS 可以通过一个简单的分配来处理所有这些,那就太好了。

    【讨论】:

      猜你喜欢
      • 2018-08-19
      • 1970-01-01
      • 1970-01-01
      • 2020-03-20
      • 2019-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-22
      相关资源
      最近更新 更多