处理延迟异步回调的典型方法

时间:2014-03-10 12:33:33

标签: javascript angularjs asynchronous

我是使用Javascript进行Web应用程序开发的新手。

由于Javascript应用程序似乎高度异步,我想知道是否有一种常见的方法来处理调用太晚的回调。 例如,假设发出了异步请求,并且当响应最终返回时,应用程序处于不同的状态,最终不适合处理响应。

如果成功和错误响应,您如何检测这种情况并处理它?这个问题可以从高级架构视图中解决,还是这种解决方案总是与JS框架和/或应用程序类型相关联?

在相关问题上,是否建议使用Web应用程序阻止输入,同时进行服务器端处理?

谢谢

2 个答案:

答案 0 :(得分:2)

您的问题的快速回答是承诺

承诺是一种可能很快实施到ECMA-6的模式,但目前通过自己的自定义代码或使用Kris Kowal的q(见下文)等库来实施。

模式相当简单。您的目标是包装异步执行的方法或函数,以便保留它的范围,然后对其进行操作。对于大多数库和方法,这被称为then语句。

一个简单的例子:

var theEventualResults;

goGetMeSomething().then(function(results) {
  //now I can store the results in my working scope
  theEventualResults = results;
});

这个想法是goGetMeSomething()返回一个" Promise Object"具有在goGetMeSomething成功执行时执行的方法then。还有一些方法可以通过捕获错误或从请求中读取失败响应代码来实现失败。

失败的例子:

var theEventualResults;

goGetMeSomething().then(function(results) {
  //now I can store the results in my working scope
  theEventualResults = results;
}).error(function(reason) {
  //now I can handle the failure, if it fails;
});

我建议你对Promises及其在不同库中的不同实现进行一些研究,以进一步掌握。这也有助于您找到适合您特定应用的最佳选择。

因此,在审核您的问题时:

  1. 如果成功和错误响应,您如何检测这种情况并处理它?
    • 承诺模式可能最有用
  2. 这个问题可以从高级架构视图中解决,还是这种解决方案总是与JS框架和/或应用程序类型联系在一起?
    • 这种解决方案可以独立于任何框架在JavaScript中实现。但是,如果您正在使用框架,那么它可能已经具有承诺模式。实现框架提供的内容通常很有用,而不是使用其他东西。 AngularJSAlex C指出的一个很好的例子。
  3. 在相关的问题上,是否建议使用Web应用程序阻止输入,同时进行服务器端处理?
    • 这有点超出了范围。我建议在另一个问题中提出这个问题。
  4. 以下是一些图书馆参考资料:

    我不建议您使用其中任何一种。这是你发现的。希望这可以帮助您看到模式,然后让您自己决定。

答案 1 :(得分:1)

在angularJS中,您可以使用$q.defer()resolve()reject()promise,例如:

MyObject.myMethod = function(options){

  var deferred = $q.defer();

  myAsyncMethod(options, function(callback_data){
     deferred.resolve(callback_data);
  });  

  return deferred.promise;


};

然后代码中的其他地方:

 var foo = New MyObject();
   foo.myMethod(options).then(function(callback_data){
      // process callback here;
   });