0

私はJavaScriptを学んでいるところですが、JavaScriptが関数を非同期的に処理する方法については、私のような人々にとって多くの情報があるようです。

私はまだこれに頭を悩ませようとしていますが、私がやろうとしていることのために、SharePointのcsomに苦労しています。たぶん私はこれについて完全に間違っているのかもしれませんが、私が言ったように、ただ学んでいます。

SP CSOMを使用して、次のようなリストデータを取得しようとしています。

getGridData() {
    var gridURL = "https://mySite/ListData.svc/Projects";
    var request = new Sys.Net.WebRequest();
    request.set_httpVerb("GET");
    request.set_url(gridURL);
    request.get_headers()["Accept"] = "application/json";
    request.add_completed(onCompletedProjectCallback);
    request.invoke();
}

onCompletedProjectCallback(response, eventArgs) {
      var getProject = eval("(" + response.get_responseData() + ")");
      var buildMarkUp = '';
      for (var i = 0; i < getProject.d.results.length; i++)  {
         buildMarkUp += "<div>" + getProject.d.results[i].ProjectName + "</div>";
      }
}

これはうまくいきます。

spservicesなどの他のメソッドについては知っていますが、私にとってはより高速で、好ましいJSONを返すので、これが好きです。

ProjectID上記のを使用して別の関数を呼び出し、リストから関連する値を取得するためにIDを渡すとどうなりますか。

ただし、文字列をDOMに追加する前に順番に作成したいと思いbuildMarkUpます(そうそうjQueryところで)。このようなことは完全に間違っているかもしれませんが、それは私がやろうとしていたことです:

onCompletedProjectCallback(response, eventArgs) {
      var getProject = eval("(" + response.get_responseData() + ")");
      var buildMarkUp = '';
      for (var i = 0; i < getProject.d.results.length; i++)  {
         buildMarkUp += "<div>" + getProject.d.results[i].ProjectName + "</div>";

      //call nested function here so that I can go retrieve values for each ProjectID from another list
       var getOtherData = getRelatedData(getProject.d.results[i].ProjectID);
      }
}


getRelatedData(passedProjectID) {
     // have to use the same method as the original to get more sharepoint list data
      var relatedURL = "https://mySite/ListData.svc/Related$filter=ProjectID eq " + passedProjectID;
    var request = new Sys.Net.WebRequest();
    request.set_httpVerb("GET");
    request.set_url(relatedURL);
    request.get_headers()["Accept"] = "application/json";
    request.add_completed(onCompletedRelatedCallback);
    request.invoke();
}

これは私がこれに本当に苦労しているところです。

別のコールバックは、私が正しく戻った場合、データを使用して元の関数に戻らないことを意味しますか?
元の関数は処理を継続し、ネストされた関数を起動するだけですか?
いつ/どのように/どの値が元の関数に返されるかをどのように制御できますか?できますか?

基本的に、参照されている各プロジェクト行に他のSharePointリストからのデータが含まれているテーブルを作成しようとしていて、DOMに追加する文字列が作成される順序を制御する必要がある場合はどうなりますか?

4

2 に答える 2

1

別のコールバックは、私が正しく戻った場合、データを使用して元の関数に戻らないことを意味しますか?

はい。return実行中の関数から戻りますが、ajaxloadイベントとそのハンドラーがデータを取得するのを待ちません。

元の関数は処理を継続し、ネストされた関数を起動するだけですか?

はい。一連のajaxリクエストを開始し、undefinedそれぞれに対して戻ります。

いつ/どのように/どの値が元の関数に返されるかをどのように制御できますか?できますか?

コールバックを使用する必要がありreturnます。値を""することはありません。

于 2013-02-01T14:27:47.353 に答える
1

You are correct that a function that executes a web request continues immediately and cannot return the data from that call. You need to code the callbacks to add the data they collected to a public data structure -- perhaps create an object that accumulates the data as new attributes. When you have collected all of the data, the last callback can build the HTML elements. If you are doing multiple simultaneous AJAX requests, then each callback can call a common function to see if all requests have finished. For example:

function checkLoadingComplete() {
    if (loadedData.project && loadedData.relatedData && loadedData.summaryData) {
         //now build the HTML elements
    }
}
于 2013-02-01T14:37:14.723 に答える