2016-08-22 19 views
1

e2eテストケースを実行するために分度器を使用しています。すべての分度器の呼び出しは非同期呼び出しです。以下のコードは分度器コードです:非同期呼び出しで同期変数を追跡する方法

gridRow.then(function (rows) { 
       for (var index = 0; index < rows.length; index++) { 
        console.log(index); -------------------- 1 
        rows[index].all(by.className('ui-grid-cell-contents ng-scope')).get(1).getText().then(function (text) { 
         console.log(index); ----------------- 2 
         if (text.toUpperCase().replace(/ |-/g, '') === 'BRANCHONE') { 
          console.log(index); -------------- 3        
         } 
        }); 
       } 
      }); 

この場合、rows.length = 2です。 Console.logは1出力0と1で期待通りですが、であるため、2と3の出力のconsole.logはasync.Asyncが非同期呼び出しを並列に実行するため、 〜2(インデックス++)。

私の非同期呼び出し内でその同期variale(インデックス)をどのように追跡するかについての任意のアイデアですか?

答えて

1

通常は、別の関数でコールバック関数をラップして、新しいスコープで同期変数を取得します。説明するために、どのようなあなたが今持っていることは事実である:

var callback = function(text) { 
    // use text and index... 
}; 
async_call(...).then(callback); 

問題は、コールバックが作成される後(コールバック関数によって捕獲された)index変数は変更はもちろんです。コールバック関数はクロージャーを使用してその値への参照を取得するため、変更された値を参照して終了します。

特定のループ反復中にindexの値を取得するには、変更されない新しい変数を使用して新しいスコープを作成できます。基本的には別の関数を作成し、現在のindexで呼び出すと、その関数のパラメータがその特定の値を取得します。次に、その関数がコールバックとして使用する別の関数を返すようにすることができます。これはcreateCallback匿名関数行うことで、よりコンパクトに記述することができ

function createCallback(curIndex) { 
    return function(text) { 
    // use text and curIndex... 
    }; 
} 

//... 

var callback = createCallback(index); // where index is the variable you are looping over 
async_call(...).then(callback); 

:その恐ろしい記述をクリアするためのサンプルコードはJavaScriptでのクロージャと関数の詳細については

var callback = (function(curIndex){ 
    return function(text) { 
    // use text and curIndex... 
    }; 
})(index); 
async_call(...).then(callback); 

は、this comprehensive answerを参照してください。

+0

上記のコードで何が起こっているのか説明できますか?私はあなたが最後に使った「私」と「インデックス」が何であるか理解していません。または役に立つ学習リソースへのリンクを共有してください –

+0

私の答えははるかに良い説明で更新されました。より多くの例/情報については、最後にリンクを確認してください。 – qxz

+0

[回答](http://stackoverflow.com/a/111200/1848578)下のリンクも良いです。 – qxz

関連する問題