2016-05-23 2 views
0

Я попытался выполнить 4 функции в строке внутри блока dojo domready, а также я хочу установить булевский флаг после выполнения этих функций, но все функции запускается асинхронно и флаг устанавливается до завершения этой функции, то есть функции не ждут завершения предыдущей функции, все они только начинаются и переходят к следующему.Как выполнить функцию только после завершения предыдущих функций в dojo

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

Как установить флаг только после выполнения всех 4-х функций

Я делюсь мой исходный код, сначала я уверен, выполнение первоначального вызова в додзё готов, где я устанавливаю 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 Я выполняю две функции configureQuoteFieldData (response) 'и' configureIrregularFrequencyData (response) ', а затем устанавливая флаг onload в true, считая, что две прежние функции выполнены полностью, но установлен флаг loadload до истины до этого.

для ссылки я привожу две функции также здесь

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

Вы должны написать свои функции, чтобы принять обратный вызов или вернуть promise. Затем запускайте следующую функцию с помощью этого, а не сразу вызывайте его.

+0

я попробовал это тоже .... – nithinalways

+0

вы можете показать мне, как это делается – nithinalways

0

С общим фрагментом кода флаг будет установлен после выполнения всех 4 функций. Но это не означает, что он завершил выполнение всей логики в рамках этой функции. Если в этих функциях есть некоторые асинхронные вызовы, они будут выполняться после установки флага.

Если вы могли бы поделиться кодом в рамках этих функций, мы могли бы дать более конкретное решение.

UPDATE: Я считаю, что код для получения реестра может вызвать проблемы.

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

Требование получает файл js, если он еще не получен с сервера. это может быть то, что происходит в вашем случае. Попробуйте иметь только один запрос на каждый файл сценария. таким образом, все необходимые файлы извлекаются перед выполнением.

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/all и dojo/Deferred, идея заключается в использовании отложенных объектов, как упоминалось в @Quentin.

Под живым примером, использующим специально конструкцию Dojo.

https://jsfiddle.net/9khdr4qa/

Пояснение:

  • код работает 3 функции, которые будут возвращать асинхронно, каждая функция возврата в разное время, как указано SetTimeout().

  • Теперь вы хотите установить флаг в true, только после того, как будут возвращены и завершены все 3 функции.

  • Решение включает отложенный объект в каждой функции. Когда функция возвращает отложенный объект 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> 
Смежные вопросы