在你们开始尖叫关于重构和回调之前,请完整地阅读这个问题,请:)
我在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”,但不幸的是它们都是完全不受我控制的组件,因为它们是我无法修改的现有系统的一部分(由于官僚主义而不是技术原因)
有什么想法摆脱这个?
答案 0 :(得分:2)
好吧,幸运的是我发现我在我的问题中提到的框架(调用myFunc
的那个)有一个初始化阶段,我可以根据需要注入尽可能多的promises,框架会等待让他们在继续之前完成并调用其他内容,包括myFunc
,这样我就可以在初始化阶段构建我的items
对象,之后就可以使用它了。
这解决了我的问题,因为它没有回答我原来的问题。我还会等几天才能看到有人知道某种解决方法,但从我读过的内容来看,我觉得无法做到这一点。
答案 1 :(得分:1)
您已经知道答案:-)如果您没有其他选择,那么根本没有选项。从根本上说,不可能立即返回将来会获得的值。
也就是说,如果你能够将整个框架包装在Fiber或类似的东西中,那么就存在some solutions可以阻止调用者的世界。当然,这需要对整个系统进行根本性的改变,但可以在不改变框架代码的情况下完成。但这可能会导致一些bugs due to unexpected timing。