等待javascript承诺完成(当我没有其他选项时......)

时间:2017-11-14 10:31:36

标签: javascript promise

在你们开始尖叫关于重构和回调之前,请完整地阅读这个问题,请:)

我在javascript中有以下情况(为方便起见,代码已简化):

    function myFunc(){
        var myItems = getItemsAsync(); //this returns a promise

        return {
            settings: {
                type: "items",
                component: "accordion",
                items: myItems //WRONG! This is a promise, not the data itself!
            }
        }
    }

以下是这种情况:我有一个调用myFunc的外部框架,并期望返回的对象{settings: etc...}已经填写了所有值,包括items子对象。我无法控制此框架如何调用myFunc,因此我无法将其更改为接受promise或部分结果,当myFunc返回时,返回的对象必须“准备好”。

现在,正如您所看到的,问题在于:获取items我需要调用设计异步的API,并返回一个promise。不幸的是,这个API也不受我的控制,所以我不能修改它以同步工作。

所以基本上我处于僵局:我必须同步返回一个完整的对象,但该对象的其中一个部分只能异步获取!!

有没有办法解决这个问题?我在这里看到的所有类似的问题都表明等待承诺完成是不可能的......是真的吗?

我知道你们都渴望说:“更改CALLER或API”,但不幸的是它们都是完全不受我控制的组件,因为它们是我无法修改的现有系统的一部分(由于官僚主义而不是技术原因)

有什么想法摆脱这个?

2 个答案:

答案 0 :(得分:2)

好吧,幸运的是我发现我在我的问题中提到的框架(调用myFunc的那个)有一个初始化阶段,我可以根据需要注入尽可能多的promises,框架会等待让他们在继续之前完成并调用其他内容,包括myFunc,这样我就可以在初始化阶段构建我的items对象,之后就可以使用它了。

这解决了我的问题,因为它没有回答我原来的问题。我还会等几天才能看到有人知道某种解决方法,但从我读过的内容来看,我觉得无法做到这一点。

答案 1 :(得分:1)

您已经知道答案:-)如果您没有其他选择,那么根本没有选项。从根本上说,不可能立即返回将来会获得的值。

也就是说,如果你能够将整个框架包装在Fiber或类似的东西中,那么就存在some solutions可以阻止调用者的世界。当然,这需要对整个系统进行根本性的改变,但可以在不改变框架代码的情况下完成。但这可能会导致一些bugs due to unexpected timing