2017-05-07 81 views
0

让我们来看看这个:来自内部回调函数的返回值;呼叫必须阻止

protected getSettingByKey(key: string) : string { 

    let ret = null; 

    let api : BrowserAPI = Browser.getCurrentBrowserAPI(); 

    let setting = api.readSetting(this.getUUID() + "." + key, "true", (value:string) => { 
     ret = key; 
    }); 

    while (true) { 
     if (ret != null) return ret; 
     console.log("KEY IS NULL, SKIPPIN"); 
    } 

} 

这是读取浏览器的设置,本地数据存储和MUST块,直到函数返回readSetting()东西的功能。

我试过上面的方法,但它最终成为一个死循环。

我再说一遍,功能MUST,通过各种手段BLOCK,它必须有任何回调。

如何实现?

我知道这是一种反模式,但这是它必须的方式。

+0

您不得尝试使用阻塞函数。我再说一遍,在任何情况下,您都不能在异步功能上使用BLOCK。 – Bergi

+0

您唯一的选择是重写'api.readSetting'以使其同步,例如将XMLHttpRequest调用更改为'async:false'。但正如其他人所说,你可能不想这样做。你为什么认为你这样做? – 2017-05-08 02:01:31

回答

2

如果api.readSetting是异步的,那么你的不能这样做。

从问题中的多个语句中必须阻止并且不能使用回调,我假设您熟悉这个解决方案是而不是阻止并使用回调(直接或通过承诺),as described here

但没有这样做,如果你打电话给一个异步功能,你不能使你的功能同步。您无法同步等待异步进程在基于浏览器的JavaScript中完成。

+0

这就是我所害怕的。我认为有一些方法可以解决运行时问题(比如你在Web开发中做了90%的时间;“我怎么欺骗浏览器去做这个*?”),但我认为没有办法。好吧。 – Gala

+0

@加拉:没有,没有。 *(我不得不说这种表征与我的网页开发经验不符)* –