我有一些第三方库正在监听其事件。我有机会修改该库将要添加到UI中的数据。直到数据修改是同步的,一切都很好。一旦涉及Ajax回调/承诺,这将无法正常工作。让我举一个例子来说明问题所在。
以下是我如何收听事件:-
d.on('gotResults', function (data) {
// If alter data directly it works fine.
data.title = 'newTitle';
// Above code alters the text correctly.
//I want some properties to be grabbed from elsewhere so I make an Ajax call.
$.ajax('http://someurl...', {data.id}, function (res) {
data.someProperty = res.thatProperty;
});
// Above code doesn't wait for ajax call to complete, it just go away and
renders page without data change.
// Yes I tried promises but doesn't help
return fetch('http://someurl...').then(function (data) {
data.someProperty = res.thatProperty;
return true;
});
// Above code also triggers the url and gets away. Doesn't wait for then to complete.
});
我无法更改/更改第三方库。我所要做的就是听事件并更改数据。
任何更好的解决方案。不。我不能使用异步/等待生成器,因为我想让ES5浏览器支持它。
最佳答案
您不能让同步函数等待异步响应,从定义上讲根本不可能。您的选择几乎是:
坏主意:发出同步AJAX请求。再次:糟糕的想法。这不仅会阻塞整个浏览器,而且也是不推荐使用的做法,因此不应在新代码中使用,甚至永远不要使用。
首先获取异步数据并将其存储在本地,因此在需要时可以同步使用。显然,这只有在您提前知道将需要哪些数据的情况下才有效。
更改第3方库,以添加对异步回调的支持,或请求供应商的支持。
找到一些解决方法,您可以在其中首先使库处理不完整的数据,然后在异步数据可用时对其进行更新。显然,这在很大程度上取决于该库的细节和正在完成的任务。
关于javascript - 保持回调函数执行,直到 promise 完成,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48298824/