2016-05-23 8 views
0

dojo domreadyブロック内の行に4つの関数を実行しようとしましたが、これらの関数の実行後にブールフラグを設定したいのですが、非同期的に起動され、フラグはこれらの関数の完了前に設定されます。つまり、関数は前の関数が完了するのを待たずに、ただ開始されて次の関数に移ります。のみすべての4つの機能の実行後にフラグを設定する方法 dojoの以前の関数の完了後にのみ関数を実行する方法

require([ 'dojo/domReady!' ], function() { 
     boolean flag=false; 
     function1(); 
     function2(); 
     function3(); 
     function4(); 
     flag=true; 
    }); 

私はフラグのonloadを設定していますどこまず私は、準備ができ道場での最初の呼び出しを実行しています、私の元のコードを共有しています偽最初

require([ 'dojo/domReady!' ], function() { 
    onload = false; 
    getQuoteOption(); 
}); 

その後、関数「getQuoteOption()」で私はAJAX呼び出しを発射していますと、いくつかのJSONデータをフェッチ取得する

function getQuoteOption(){ 
     var reqParams = addQuoteReqParams(reqParams);//getting json input data 
     var request = require("dojo/request"); 
     request.get(url, { 
      query : { 
       inputJson : reqParams 
      }, 
      handleAs : "json", 
      preventCache : true 
     }).then(function(response) { 
      configureQuoteFieldData(response); 
      configureIrregularFrequencyData(response); 
      onload=true; 
     }, function(error) { 
      console.log(error); 
     }); 
} 

ajax呼び出しのコールバック私は2つの関数 'configureQuoteFieldData(response)'と 'configureIrregularFrequencyData(response)'を実行していて、2つの元の関数が完全に実行されたのにフラグonloadが設定されているその前に真実に。私もここであなたがコールバックを受け入れるかpromiseを返すために、あなたの関数を作成する必要が

function configureQuoteFieldData(quoteFieldData) { 
    var registry = require("dijit/registry"); 
    registry.byId('form_quoteData').set('value', quoteFieldData);//setting data to form 
} 



function configureIrregularFrequencyData(obj) { 
    var tmpArray = []; 
     for (var i in obj) { 
      tmpArray.push(obj[i]); 
     } 
     irregularPayMonths['irregularData'] = tmpArray;//saving to global variable 

    } 

答えて

0

2つの機能をリストアップしています参照するための

。その後すぐに呼び出すのではなく、それを使って後続の関数を起動します。

+0

を私はあまりにもそれを試してみました.... – nithinalways

+0

あなたは私にその出来事を見せてもらえますか – nithinalways

0

コードスニペットを共有すると、4つのすべての機能を実行した後にフラグが設定されます。しかし、それはそれらの機能内のすべてのロジックの実行を完了したことを意味するものではありません。これらの関数内にいくつかの非同期呼び出しがある場合、それらはフラグが設定された後に実行されます。

これらの関数内でコードを共有することができれば、より具体的な解決方法を提供できます。

更新: レジストリを取得するコードが原因で問題が発生している可能性があります。

var registry = require("dijit/registry"); 

jsファイルがまだサーバーから取得されていない場合は、requireが取得されます。あなたの場合に起こっていることかもしれません。スクリプトファイルごとに1つだけのrequireが必要です。そのようにして、すべての必要なファイルが実行前に取得されます。

require(["dijit/registry","dojo/request", "dojo/domReady!"], function(registry, request) { 

    function getQuoteOption(){ 
     var reqParams = addQuoteReqParams(reqParams);//getting json input data 
     request.get(url, { 
      query : { 
       inputJson : reqParams 
      }, 
      handleAs : "json", 
      preventCache : true 
     }).then(function(response) { 
      configureQuoteFieldData(response); 
      configureIrregularFrequencyData(response); 
      onload=true; 
     }, function(error) { 
      console.log(error); 
     }); 
    } 

    function configureQuoteFieldData(quoteFieldData) { 
     registry.byId('form_quoteData').set('value', quoteFieldData);//setting data to form 
    } 

    function configureIrregularFrequencyData(obj) { 
     var tmpArray = []; 
     for (var i in obj) { 
      tmpArray.push(obj[i]); 
     } 
    } 

    onload = false; 
    getQuoteOption(); 
}); 

モジュールと対応する関数パラメータの順序が一致していることを確認してください。

0

dojo/promise/alldojo/Deferredを使用することを検討すると、@Quentinのように遅延オブジェクトを使用することを考えます。

以下は、特にdojoフレームワークを使用したライブ例です。

https://jsfiddle.net/9khdr4qa/

説明:

  • コードは非同期戻ります3つの機能、のsetTimeout(で示されるように、異なる時刻における各関数の戻り)を実行します。

  • 3つの関数がすべて返されて実行された後で、フラグをtrueに設定します。

  • 解決策には、各機能に遅延オブジェクトが含まれています。関数が返すとき、遅延オブジェクトはFulfilledです。

  • dojo/promise/allを使用すると、3つの関数がすべて返されたときを検出できます。基本的にそのコールバックは、3つの遅延オブジェクトすべてがFulfilledとマークされた後にのみ実行されます。

  • あなたがflagからtrueまで設定してコードを実行してください。

あなたはここに道場の約束及び繰延オブジェクトの詳細を読むことができます:

http://dojotoolkit.org/reference-guide/1.10/dojo/promise.html

https://dojotoolkit.org/reference-guide/1.10/dojo/Deferred.html

require(["dojo/promise/all", "dojo/Deferred", "dojo/dom", "dojo/on", "dojo/json", "dojo/domReady!"], 
    function(all, Deferred, dom, on, JSON) { 
    var flag = false; 

    function requestA() { 
     var deferred = new Deferred(); 
     setTimeout(function() { 
     deferred.resolve("requestA"); 
     }, 500); 
     return deferred.promise; 
    } 

    function requestB() { 
     var deferred = new Deferred(); 
     setTimeout(function() { 
     deferred.resolve("requestB"); 
     }, 750); 
     return deferred.promise; 
    } 

    function requestC() { 
     var deferred = new Deferred(); 
     setTimeout(function() { 
     deferred.resolve("requestC"); 
     }, 1000); 
     return deferred.promise; 
    } 

    on(dom.byId("startButton"), "click", function() { 
     dom.byId("output").innerHTML = "Running..."; 
     all([requestA(), requestB(), requestC()]).then(function(results) { 
     dom.byId("output").innerHTML = JSON.stringify(results); 
     flag = true; 
     alert('Your flag is set to: ' + flag); 
     }); 
    }); 

    }); 

<h1>Click to start:</h1> 
<pre id="output"></pre> 
<button type="button" id="startButton">Start</button> 
関連する問題