2015-10-16 54 views
0

我确信有一个简单的方法可以做到这一点,但我在围绕异步调用及其流程方面困难重重。我试图在javascript中做一个简单的赋值语句,然后设置一个定时器,在该对象被赋值后对其执行操作。我有一些沿线:Javascript异步分配和回调

var info = getInfo(); 
$timeout(updateInfo(info), 5000); 

但是,我不希望超时被执行,直到最初设置信息。我试图寻找使用.then或某种形式的回调,但我还没有成功确定如何做到这一点。我不确定在updateInfo调用中是否使用info参数使得我无法在getInfo中使用回调或正确的流程。我读过其他文章和堆栈溢出响应,但无法找到一个处理异步分配的问题,然后在随后的调用中使用它作为参数。

getInfoupdateInfo是返回Highcharts图形配置对象的方法。而不复制了所有的具体细节:

getInfo: function() { 
    return { 
    options: { 
     chart: { 
     type: 'line' 
     } 
    } 
    ... 
    } 
} 

updateInfo: function(info) { 
    // Here computations are performed on plot series data. 
    info.series.push(...) 
} 
+0

你能分享一下'getInfo'和'updateInfo'的实现吗?看起来像你正在使用角度,是这样吗? – idoshamun

+0

如果你还没有找到它,[这个问题](http:// stackoverflow。com/questions/14220321/how-to-return-the-a-an-asynchronous-call)被认为是堆栈溢出的典型参考,但是 - 正如@Shamun所说,没有看到这些功能的细节很难说。 –

+0

它应该是'$ timeout(函数(info){updateInfo(info);},5000);'至少。但除非'getInfo'异步工作,否则应该没问题。 – raina77ow

回答

1

两个getInfoupdateInfo小艾同步给我。 所以不应该有任何同步问题。

我注意到的唯一情况是在您的示例中错误地使用了$timeout$timeout(updateInfo(info), 5000);这种方式updateInfo将在超时开始前被调用,并且返回的值将作为参数传递。

为了在5秒后致电updateInfo您必须使用匿名功能或bind功能。

$timeout(function() { updateInfo(info); }, 5000);

$timeout(updateInfo.bind(null, info), 5000);

欲了解更多信息有关bind

+0

这为我解决了它。感谢您的建议! – fowlball1010

1

你应该记住的是,虽然JavaScript的做一些异步操作,还没有分配给一个变量是同步的,这意味着它发生在你请求的那一刻,并获得在完成之前,不要继续下一行。

如果getInfo本身具有变量info的作用域并在异步调用期间更新它,则不应在调用该函数时为其分配值。

如果我困惑你,让我猜你在那里做什么(并请提供getInfo函数来澄清你的问题)。

我很确定getInfo做的是一个ajax调用。所以,如果你已经使用jQuery,你可以简单地使用他们的AJAX功能:

function getInfo(){ 
    $.ajax({ 
     url: "/api/items" 
    }).done(updateInfo); 
} 

function updateInfo(data){ 
     console.log ('Do something with', data); 
} 

getInfo(); 

查看完整的文档: http://api.jquery.com/jquery.ajax/