2013-04-20 62 views
0

對不起,我的英文。我做了一些測試客戶端來測試我們的Web服務器,但我對我的工作感到不滿。請幫我改進我的代碼。JavaScript中的反應性http請求

我想發出串行HTTP請求。我有一個測試請求陣列:

Aua.Queries = ko.observableArray([ 
    new Query("/srv?key=value&key2=someValue", 300, "comment for this request"), 
    new Query("/srv?someKey=SomeValue", 0, "comment for this request") 
]); 

(在Aua.Queries陣列24個查詢)

我對Aua.Queries observableArray包裝:

function Query(query, result, comment) { 
    var me = this; 
    me.Query = "http://mydomain.com?" + query; 
    me.Result = result; 
    me.Comment = comment; 
    me.Selected = ko.observable(false); 
} 

當點擊發送處理程序,我這樣做:

Aua.SendHandler = function() { 
    Aua.Loading(true); 
    Aua.Responses([]); 
    if (Aua.Advanced() == true) { 
     var queries = Aua.Queries(); 
     console.log("Selected Request Count: ", 
      Enumerable.From(queries).Where("$.Selected() == true").Select(function(query) { 
       console.log("Result: ", query.Result); 
       Aua.Url(query.Query); 
       query.Selected(false); 
       sendRequest(); 
      }).Count()); 
    } 
    else if (Aua.RequestCount() > 1) { 
     for (var i = Aua.RequestCount(); i > 0; i--) { 
      Aua.RequestCount(i); 
      setUrlByStatus(); 
      sendRequest(); 
     } 
    } 
    else 
     sendRequest(); 
}; 

而且sendRequest處理程序:

function sendRequest() { 

    console.log("Sending request to: ", Aua.Url()); 

    $.ajax(Aua.Url(), { 
     dataType: 'text', 
     cache: false, 
     type: 'GET', 
     success: function(data, status, xhr) { 
      Aua.Responses.push({ 
       "Data": data, 
       "Status": xhr.status + " " + xhr.statusText 
      }); 
      prettyPrint(); 
     }, 
     error: function(xhr, status, data) { 
      Aua.Responses.push({ 
       "Data": data, 
       "Status": xhr.status + " " + xhr.statusText 
      }); 
      prettyPrint(); 
      console.log("Error: ", Aua.Responses()); 
     }, 
     complete: function() { 
      Aua.Loading(false); 
     } 
    }); 
} 

設置請求格式的類型。

function setUrlByStatus() { 
    if (Aua.RequestStatus() === "error") 
     Aua.Url(Aua.Queries()[Math.floor(Math.random() * Aua.Queries().length)].Query); 
    else 
     Aua.Url(
      "http://mydomain.com?" + 
       "action=" + Aua.Action() + 
       "&number=" + Aua.Number()); 
} 

A有3種類型的發送請求。

  1. 從Aua.Queries數組發送多個請求。
  2. 發送請求由depent計數。
  3. 併發送1請求輸入。
+3

改進代碼的請求屬於在這個論壇:http://codereview.stackexchange.com,不在這裏。如果您提出問題,請清楚地說明您問的是什麼問題。 – jfriend00 2013-04-21 00:57:59

回答

0

我做我自己。

,我學到了如何organaize我的代碼

/* 
    Client requests for tes our server 

Make different demands on the Serer. 
Query setings: 
     Send something that is in the input. 
     Send to a specified number of times queries and allow the user to choose what kind of answer he wants, success or error. 
         For successful actions are random data request: email, account, paper. 
     Send requests from the table. 

     All the answers to print. Prettify XML response. 

     After the data to make a progress report 
         The following table show: Status Code, Comments, Quantity. 

     HTTP status display for each response received and paint the fatal errors in red. 
*/ 

(function (global, undefined) { 

    function ajaxObject(url, query, response, loading) { 

     console.log("Query: ", query()); 

     var catched = query(); 
     return $.ajax({ 
      cache: false, 
      dataType: "text", 
      type: "GET", 
      url: url() + catched, 
      success: function (data, status, xhr) { 
       response.push({ 
        Data: data, 
        Query: catched, 
        Status: xhr.status + ' ' + xhr.statusText 
       }); 
      }, 
      error: function (xhr, status, data) { 
       response.push({ 
        Data: data, 
        Query: catched, 
        Status: xhr.status + " " + xhr.statusText 
       }); 
      }, 
      complete: function() { 
       loading(false); 
       prettyPrint(); 
      } 
     }); 
    } 

    function Query(query, result, comment) { 
     var me = this; 
     me.Query = query; 
     me.Result = result; 
     me.Comment = comment; 
     me.Selected = ko.observable(false); 
     me.Describtion = ko.observable(comment); 
     me.DescribtionComment = function (data) { me.Describtion(data.Comment); }; 
     me.DescribtionQuery = function (data) { me.Describtion(data.Query); }; 
    } 

    var queries = [ 
     new Query("/zibaba?paper=go&id=1&account=someacc&date=20130221174323", 453, "Error. Expected parameter test"), 
     new Query("/zibaba?paper=go&account=someacc", 0, "Expected parameter test"), 
     new Query("/zibaba?paper=do&id=3&account=someacc&date=20130221174323", 1, " Forbidden")) 
    ]; 

    var Aua = global.Aua = new function Aua() { }; 
    Aua.Configuration = { 
     Advanced: { 
      Queries: queries, 
      QueriesSelectAll: ko.observable(false), 
      Toggle: ko.observable(false) 
     }, 
     Counter: ko.observable(1), 
     Query: ko.observable(), 
     Url: ko.observable(), 
     Status: ko.observable("success") 
    }; 
    Aua.Configuration.Advanced.QueriesSelectAll.subscribe(function() { 
     var qs = Aua.Configuration.Advanced.Queries; 
     for (var i = 0; i < qs.length; i++) 
      qs[i].Selected(!qs[i].Selected()); 
    }); 
    Aua.IsLoading = ko.observable(false); 
    Aua.SendHandler = function() { 
     Aua.IsLoading(true); 
     Aua.Responses([]); 
     if (Aua.Configuration.Advanced.Toggle() === true) { 
      $.when(Enumerable.From(Aua.Configuration.Advanced.Queries) 
       .Where("$.Selected() === true") 
       .Select(function(current) { 
        Aua.Configuration.Query(current.Query); 
        return ajaxObject(Aua.Configuration.Url, Aua.Configuration.Query, Aua.Responses, Aua.IsLoading); 
       }).ToArray()); 
     } else { 
      $.when(Enumerable.Generate(function() { 
       var papers; 

       if (Aua.Configuration.Status() == "success") { 
        papers = ["do", "go"]; 

        Aua.Configuration.Query(
         "?account=" + Math.floor(Math.random() * 1234567 + 1) + 
          ("&paper=" + papers[Math.floor(Math.random() * papers.length)]) + 
          ("&id=" + Math.floor(Math.random() * 123754 + 1))); 
       } else if (Aua.Configuration.Status() == "error") { 
        papers = ["do", "go", "justdoit"]; 
        var accounts = [Math.floor(Math.random() * 1234567 + 1), " ", Math.floor(Math.random() * 4532 + 1)], 
         ids = [" ", (Math.floor(Math.random() * 123754 + 1)), (Math.floor(Math.random()))]; 

        Aua.Configuration.Query(
         "?account=" + accounts[Math.floor(Math.random() * accounts.length)] + 
          "&paper=" + (papers[Math.floor(Math.random() * papers.length)]) + 
          "&id=" + (ids[Math.floor(Math.random() * ids.length)])); 
       } 

       return ajaxObject(Aua.Configuration.Url, Aua.Configuration.Query, Aua.Responses, Aua.IsLoading); 
      }, Aua.Configuration.Counter()).ToArray()); 
     } 
    }; 
    Aua.ResetHandler = function() { location.reload(); }; 
    Aua.Statistics = { 
     Code: ko.observable(0), 
     Comment: ko.observable(0), 
     Quantity: ko.observable(0) 
    }; 
    Aua.Responses = ko.observableArray([{ 
     Data: ko.observable(), 
     Status: ko.observable(-1) 
    }]); 
    Aua.Responses([]); 

    $(document).on("ready", function() { 
     ko.applyBindings(Aua); 
    }); 
})(window); 

對不起,我的英語