我有一些第三方库,我正在监听其事件。我有机会修改该库将附加到 UI 中的数据。在数据修改同步之前一切都很好。一旦我涉及到 Ajax 回调/ promise ,这就不起作用了。让我举一个例子来说明问题。
以下是我监听事件的方式:-
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 方库以添加对异步回调的支持,或请求 vendor 提供支持。
找到一些技巧,您可能会让库首先处理不完整的数据,然后在异步数据可用时更新它。这显然在很大程度上取决于该库的具体情况和正在完成的任务。
关于javascript - 保持回调函数执行直到 Promise 完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48298824/