2012-04-27 111 views
2

所以我有一个异步的Web请求方法有回调:如何实现递归回调模式?

private void DoWebRequest(string url, string titleToCheckFor, 
          Action<MyRequestState> callback) 
{ 
    MyRequestState result = new MyRequestState(); 
    // ... 
    // a lot of logic and stuff, and eventually return either: 
    result.DoRedirect = false; 
    // or: 
    result.DoRedirect = true; 
    callback(result); 
} 

(只是指出来了前面,我WebRequest.AllowAutoRedirect被设置为false多种原因)

我不“T手之前知道有多少重定向可以期待,所以我开始:

private void MyWrapperCall(string url, string expectedTitle, 
          Action<MyRequestState> callback) 
{ 
    DoWebRequest(url, expectedTitle, new Action<MyRequestState>((a) => 
    { 
     if (a.DoRedirect) 
     { 
     DoWebRequest(a.Redirect, expectedTitle, new Action<MyRequestState>((b) => 
     { 
      if (b.DoRedirect) 
      { 
      DoWebRequest(b.Redirect, expectedTitle, callback); 
      } 
     })); 
     } 
    })); 
} 

现在我的脑子崩溃,我怎么可能把这是一个反复循环,这样它的最后一个回调回如果不需要ReDirects,则为原始呼叫者è?

回答

4

商店的递归方法的引用,因此它可以调用自身:

private void MyWrapperCall(string url, string expectedTitle, Action<MyRequestState> callback) 
{ 
    Action<MyRequestState> redirectCallback = null; 
    redirectCallback = new Action<MyRequestState>((state) => 
    { 
     if(state.DoRedirect) 
     { 
      DoWebRequest(state.Redirect, expectedTitle, redirectCallback); 
     } 
     else 
     { 
      callback(state); 
     } 
    }); 

    DoWebRequest(url, expectedTitle, redirectCallback); 
} 
+0

嗯谢谢主席先生!真棒和优雅,它的工作原理以及... – 2012-04-27 15:04:34