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

等待javascript承诺完成(当我没有其他选择时…),javascript,promise,Javascript,Promise,在你们开始抱怨重构和回调之前,请仔细阅读问题:) 我在javascript中遇到了以下情况(为了方便起见简化了代码): 情况是这样的:我有一个外部框架,它调用myFunc,并期望返回的对象{settings:etc..}已经填充了所有值,包括项子对象。我无法控制此框架如何调用myFunc,因此无法将其更改为接受承诺或部分结果,当myFunc返回时,返回的对象必须“就绪” 现在,正如您所看到的,问题是:要获得项,我需要调用一个设计上是异步的API,并返回一个承诺。不幸的是,这个API也是我无法控制

在你们开始抱怨重构和回调之前,请仔细阅读问题:)

我在javascript中遇到了以下情况(为了方便起见简化了代码):

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

现在,正如您所看到的,问题是:要获得
,我需要调用一个设计上是异步的API,并返回一个承诺。不幸的是,这个API也是我无法控制的,所以我无法修改它以同步工作

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

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

我知道你们都想说什么:“要么改变调用者,要么改变API”,但不幸的是,它们都是完全不受我控制的组件,因为它们是我无法修改的现有系统的一部分(由于官僚原因,而不是技术原因)


有什么想法吗?

好吧,幸运的是,我发现我在问题中提到的框架(调用
myFunc
的框架)有一个初始化阶段,我可以根据需要注入尽可能多的承诺,框架将在继续调用其他东西之前等待它们完成,包括
myFunc
,因此我能够在初始化阶段构建我的
items
对象,之后它就可以使用了


这解决了我的问题,虽然它没有回答我原来的问题。我还要等几天,看看是否有人知道解决方法,但从我同时阅读的内容来看,我想要的似乎无法实现。

你已经知道答案:-)如果你没有其他选择,你就没有任何选择。根本不可能立即返回将来将获得的值


也就是说,如果您能够将整个框架封装在光纤或类似的东西中,那么就存在一种可以阻止调用者世界的方法。当然,这需要对整个系统进行根本性的更改,但是可以在不更改框架代码的情况下完成。但是,这可能会导致一些问题。

请查看本文。如果myFunc必须返回异步获取的任何内容,则它无法同步返回值-您必须更改myFunc的调用方式。无法使异步结果同步。。。只要想一想,你就会明白这是为什么impossible@JaromandaX:即使在轮询/等待时也没有?抱歉,如果这听起来很傻,但我不是javascript专家。。。为什么不能这样做?当某个函数进行轮询或查询时,该函数不能被“搁置”waits@JaromandaX那么我就不走运了:/Thanway有趣的是,谢谢你让我注意到了光纤,如果我发现自己再次遇到类似的解决方案,它会派上用场。幸运的是(见我的答案),我能够以一种“适当”的方式解决这个问题,但是+1向您提供信息。
    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!
            }
        }
    }