【问题标题】:Nested (extended) promises seem to require a global variable嵌套(扩展)承诺似乎需要一个全局变量
【发布时间】:2019-12-30 20:37:27
【问题描述】:

我编写了一个库函数pRead(Path),它返回一个JavaScript Promise 以使用Ajax 在Apache 服务器下读取本地计算机上的文件。我不会包含这方面的代码,因为它使用的标准技术对于任何可以很好地回答这个问题的人来说都是众所周知的。

我想编写第二个库函数pReadObj(Path),它将返回一个 Promise 以读取 JSON 文件并将其对象值提供给异步代码。它应该像这样工作:

pReadObj("test.json").then(then2).catch(pErr);
function then2(obj)
    {
    alert(JSON.stringify(obj)); // Shows the JSON obj
    } // then2

这是我写的代码:

var globalPreviousResolve;

function pReadObj(Path) // Promise to read JSON from file
    {
    return new Promise(function(resolve,reject)
        {
        globalPreviousResolve=resolve;
        pRead(Path).then(pReadObj2).catch(pErr);
        });
    } // pReadObj

function pReadObj2(JSONStr)
    {
    globalPreviousResolve(JSON.parse(JSONStr));
    } // pReadObj2

function pTestDB() // Called from button
    {
    pReadObj("test.json").then(then2).catch(pErr);
    } // pTestDB

这可行,但有一个问题:使用全局变量来保存解析回调不仅丑陋,而且如果在短时间内发生两次对 pReadObj 的调用并且磁盘读取需要更长的时间,它显然会发生故障比那个。

resolve 函数需要以某种方式存储在 Promise 中,我在想。

【问题讨论】:

    标签: javascript promise


    【解决方案1】:

    no need to explicitly create a Promise;只需返回由.then 创建的那个:

    function pReadObj(Path) {
      return pRead(Path).then(JSON.parse);
    }
    

    【讨论】:

    • 哇。这样可行。如此简单而优雅,隐式处理参数的方式。承诺是非凡的。谢谢,AuxTaco。
    猜你喜欢
    • 2018-04-17
    • 2015-08-18
    • 1970-01-01
    • 2019-09-28
    • 2017-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多