【问题标题】:Simplest way of doing a callback when two ajax request are complete两个ajax请求完成时最简单的回调方法
【发布时间】:2014-04-13 03:54:38
【问题描述】:

我有一个用作 API 的 Node.js 应用程序。我收到一个请求,基于我对另一台服务器执行一些 ajax 请求、缓存结果并将结果发送回客户端的操作。

现在对于这个新请求,我需要执行两个单独的 ajax 调用,并在它们都完成后向客户端提供响应。为了加快速度,如果可能的话,我不想嵌套它们。

此外,这些 ajax 请求很棘手,有时服务器会计算我们的时间,或者返回错误的结果,在这种情况下,我会递归地执行相同的 ajax 请求。

【问题讨论】:

    标签: ajax node.js


    【解决方案1】:

    好吧,promise 让这变得微不足道:

     var http = Promise.promisifyAll(require("http"));
     Promise.all(["url1","url2"]).map(getWithRetry).spread(function(res1,res2){
          // both responses available
     }).catch(function(err){
          // error handling code
     });
    

    带有承诺的getWithRetry 的示例可能类似于:

    function getWithRetry(url){
          return http.getAsync(url).catch(function(err){ 
               return http.getAsync(url); // in real code, check the error.
          });
    }
    

    但是,你没有使用它们,所以你必须手动同步它。

     var res1,res2,done = 0;;
     requestWithRetry("url1",function(err,result){
           if(err) handleBoth(err,null,null);
           res1 = result;
           done++;
           if(done === 2) handleBoth(null,res1,res2);
     });
      requestWithRetry("url2",function(err,result){
           if(err) handleBoth(err,null,null);
           res2 = result;
           done++;
           if(done === 2) handleBoth(null,res1,res2);
     });
     function handleBoth(err,res1,res2){
         // both responses available here, the error too if an error occurred.
     }
    

    至于重试,它可以是requestWithRetry 本身的一部分,它应该只检查err 在回调中是否不为空,如果是,则重试一次或两次(取决于您想要的行为)。

    【讨论】:

    • 很好,我会看看这个。我目前正在尝试使用 setintervals 来做到这一点,但它变得一团糟。
    • @SaifBechan setIntervals 会引发非常脆弱的竞争条件。老实说 - Promise 是真正的方法。他们组成并且他们被安全地扔掉了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-06
    • 1970-01-01
    • 2013-04-26
    • 2016-05-28
    • 2016-07-22
    相关资源
    最近更新 更多