我有一些第三方库正在监听其事件。我有机会修改该库将要添加到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/

10-16 14:01