Javascript 保持回调函数执行,直到承诺完成
我有一些第三方库,我正在听它们的事件。我有机会修改该库将附加到UI中的数据。在数据修改同步之前一切正常。一旦我涉及到Ajax回调/承诺,这就行不通了。让我举个例子来说明这个问题 下面是我如何收听一个活动:-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
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浏览器支持它。不能让同步函数等待异步响应,从定义上讲这是不可能的。您的选择大致如下:
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。