Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/467.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 保持回调函数执行,直到承诺完成_Javascript_Ajax_Promise_Ecmascript 5 - Fatal编程技术网

Javascript 保持回调函数执行,直到承诺完成

Javascript 保持回调函数执行,直到承诺完成,javascript,ajax,promise,ecmascript-5,Javascript,Ajax,Promise,Ecmascript 5,我有一些第三方库,我正在听它们的事件。我有机会修改该库将附加到UI中的数据。在数据修改同步之前一切正常。一旦我涉及到Ajax回调/承诺,这就行不通了。让我举个例子来说明这个问题 下面是我如何收听一个活动:- d.on('gotResults', function (data) { // If alter data directly it works fine. data.title = 'newTitle'; // Above code alters the text correc

我有一些第三方库,我正在听它们的事件。我有机会修改该库将附加到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.

});
我无法更改/更改第三方库。我所要做的就是倾听事件并改变数据


任何更好的解决方案。不。我不能使用async/wait生成器,因为我希望ES5浏览器支持它。

不能让同步函数等待异步响应,从定义上讲这是不可能的。您的选择大致如下:

  • 坏主意:发出同步AJAX请求。再次强调:这是个坏主意。这不仅会阻塞整个浏览器,而且是一种不推荐的做法,不应该在新代码中使用,甚至永远都不应该使用

  • 首先获取异步数据并将其存储在本地,以便在需要时同步使用。显然,只有在您提前知道需要哪些数据的情况下,这才有效

  • 更改第三方库以添加对异步回调的支持,或请求供应商的支持

  • 找到一些可能让库首先处理不完整数据的方法,然后在异步数据可用时更新它。这显然在很大程度上取决于该库的具体情况和正在完成的任务


  • gotResults
    回调函数真的需要返回除
    true
    之外的任何内容吗?如果没有,那么您可以编写常规异步代码,而不让库知道。让我通过重写您的伪代码来解释我自己:

    d.on('gotResults',函数(数据){
    //如果直接更改数据,则效果良好。
    data.title='newTitle';
    //上面的代码正确地修改了文本。
    //我希望从其他地方获取一些属性,因此我进行了一个Ajax调用。
    $.ajax('http://someurl...“,{data.id},函数(res){
    data.someProperty=res.thatProperty;
    //上面的代码并没有等待ajax调用完成,它只是离开并返回
    //编辑:现在应该可以正确渲染了
    在不更改数据的情况下呈现页面。
    //是的,我试过承诺,但没有帮助
    返回获取('http://someurl...');
    //上面的代码也会触发url并离开。不必等待url完成。
    }).then(功能(数据){
    data.someProperty=res.thatProperty;
    //也许在这里再渲染一次?
    }).catch(函数(err){
    handleError(err);//处理错误,使错误不会悄悄消失
    });
    return true;//这一行在上述任何异步代码之前运行,但我们关心吗?
    
    });那么,您的第三方库需要一个同步响应,但您只有一个异步响应?那你就饱了。我们在说哪个图书馆?有没有可能不使用内置的结果转换逻辑,而是用您自己的代码来包装整个过程来处理异步性?这里的问题是。当我得到ajax响应时,库已经完成了渲染的工作。因此,改变任何JS对象都不会改变UI。