2016-05-04 13 views
0

これはまったく機能しません。基本的には、ステップ実行すると、ブレークポイント(BREAKPOINT1、BREAKPOINT2など)がある順に実行されます。jquery multiple deferred chaining

現時点では、私はSharePoint開発を行う必要があるため、すべてが非同期でなければなりません。 1つの編集リスト項目のデータをロードすると、たぶん10-12回の非同期呼び出しが発生します。だから私はどこでも深いところにいくつかの層があります。これは機能を完全に破壊しているものです。

EDIT-何が起こりたいですか。子を取得し、グループIDをリストから取得し、getgroupnameを呼び出し、すべてのID(50桁まで)のグループ名を取得し、配列の内容を隠しフィールドにダンプするので、リストを更新すると、これらのグループIDのそれぞれについて、新しいリスト項目と同じように新しいレコードを作成してください。だから私は "更新"をクリックすると、IDをつかんで、隠されたフィールドに存在しないグループのための新しいリストアイテムを作成します。これは親子関係です。選択された各グループは新しいリスト項目になりますが、複数のグループではなく1つのグループで1つだけ必要です。

このチェーンを修正してグループ名を非表示フィールドに返す方法を知っておく必要があります。私はそこに着いているだけの問題を抱えていて、誰かが私の論理の故障に気付くことを望んでいる。

function getchildren(id) { 
 
    var retval = []; 
 
    var url = "call to sharepoint 2013 url"; 
 
    var ajaxPromise = restfulAPICall(url); //inside of this includes return $.ajax 
 
    ajaxPromise.then(function (data) { 
 
    $.each(data.d.results, function (i, v) { 
 
     var def = new $.Deferred(); 
 
     getGroupname(v.Assigned_x0020_ToId.results[0]).done(//BREAKPOINT4 - multiple hits 
 
     function (val) { 
 
      def.resolve(val); //BREAKPOINT5 
 
     } 
 
     ) 
 
     .done(function() { 
 
     reval.push(def); //BREAKPOINT6 (then back to 5, etc for # of results) 
 
     }); 
 
    }); 
 
    }); 
 
    return $.when.apply(undefined, retval).promise(); //BREAKPOINT2 
 
} 
 

 
function getGroupName(v) { 
 
    var d = $.Deferred(); 
 
    var ctx = new SP.ClientContext.get_current(); 
 
    var groups = ctx.get_web().get_siteGroups(); 
 
    var groupname = groups.getById(v); 
 
    ctx.load(groupname); 
 
    ctx.executeQueryAsync(function() { 
 
    d.resolve(groupname.get_title()); 
 
    }, 
 
    function (sender, err) { 
 
    d.reject(err); 
 
    }); 
 
    return d.promise(); 
 
} 
 

 
//somewhere else 
 
if (!isChild) { 
 
    getChildren(id).then(function (val) { //BREAKPOINT1 
 
    $('#children').val(val); //BREAKPOINT3 - value blank 
 
    }); 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<input type="hidden" id="children" />

+0

実際に何が起こりたいですか?実際の質問が含まれるように質問を編集してください。 – Thernys

+0

もちろん、今やります。 –

+0

ブレークポイント2が問題だと思います。 retvalにはretvalに何かがある前に実行されます。 breakpoint6まではretvalに値を設定しません。私は非常に多くの延期の目的が不明です。私には、breakpoint4が発生するbreakpoint3を移動し、breakpoint4,5,6を削除することができます。何か不足していますか? – tpdietz

答えて

1

私は問題の核心は、あなたの非同期コードのいずれかが何かをする時間があった、とそうretvalは空の配列のまま前にgetChildrenで、return $.when.apply(undefined, retval).promise();は、すぐに実行される、ということであると仮定返された約束はすぐに空の配列に解決されます。この修正は、次のようなものに見えるかもしれません、あるいは少なくともこれは正しい方向にあなたを指している必要があります。ここでは

function getChildren() { 
    var deferredResult = $.Deferred(); 
    var url = "call to sharepoint 2013 url"; 
    var ajaxPromise = restfulAPICall(url); 
    ajaxPromise.then(function (data) { 
    var retval = []; 
    $.each(data.d.results, function (i, v) { 
     retval.push(getGroupName(v.Assigned_x0020_ToId.results[0])); 
    }); 
    // Only resolve promise returned from getChildren() once you have actually processed all the group names. Array.prototype.slice.call(arguments) converts arguments to real array 
    $.when.apply(undefined, retval).then(function() { 
     deferredResult.resolve(Array.prototype.slice.call(arguments)); 
    }); 
    }); 

    return deferredResult.promise(); 
} 

はこれがあるかもしれないかどうかを確認するために、いくつかの嘲笑AJAXデータで、あなたの元々提供されたコードから簡略化され fiddle、ありますあなたが探しているもの...

+0

私はどこに間違っているのか分かります。あなたが1つか2つを持っているときに実装するのに十分シンプルなものですが、あなたが12の深さになっているとき、それが実際に何をしているのか分かりません。助けてくれてありがとう、それは完全に動作します。 –

+1

@Cliff実際には、私はそれを比較的新鮮な目で見ているので、おそらく 'getGroupName'の戻り値(おそらくグループ名に解決される約束)を' retval'に格納しておいて、 'var def = new $ .Deferred()'です。 – Thernys

+1

@Cliffはこの単純化を反映するために私の答えを更新しました.. – Thernys