2015-05-28 3 views
0

В частности, я делаю вызов в базу данных, которая извлекает агрегированное значение. Затем это отображается пользователю. Но до того, как вызов адаптера (так как я использую подсветку) может завершиться, после этого будет выполнен код, который я хочу заблокировать. Я попробовал все от setTimeout до вызова функции, которая выполняет пустой цикл while. Ни один из них, похоже, не работает, так как код пропускает все это. Может кто-то, пожалуйста, помогите мне с этим?Есть ли способ выполнить блокирующий код в javascript?

Пример кода:

var flow_completed_percentage=0; 
function setFlowStatus() 
{ 
    var flow_name,flow_status_value; 

    for(var i = 0;i < 2; i++) 
    { 
     flow_name=flow_name_DB[i].trim();//flow_name_DB is an array that stores the flow names 
     flow_status_value=flow_status_DB[i].trim();//flow_status_DB is an array that stores the flow status values 

     if(flow_status_value=="R" || flow_status_value=="A") 
     { 
      var invocationData_totalPercentage = { 
       adapter : "dummy_adapter", 
       procedure : "getJobPercentage", 
       parameters : [flow_name] 
      }; 

      WL.Client.invokeProcedure(invocationData_totalPercentage, { 
      onSuccess : setPercentageSuccess, 
      onFailure : setPercentageFailure 
      }); 
     } 
     }//end of for loop 
    //the problem is next iteration of for loop begins before the adapter call for the current iteration completes. 
    //So flow_name gets overwritten and it gives the wrong result. 

    function setPercentageSuccess(total_percentage) 
    { 
     var tot_percent = total_percentage.invocationResult.resultSet[0]; 
     flow_completed_percentage=tot_percent.TOT_PERCENT; 
     if(flow_status=="R") 
     runningStatus(flow_name); 
     else if(flow_status=="A") 
     abortedStatus(flow_name); 
    } 

    function setPercentageFailure() 
    { 
     alert("Failed to fetch records from DB"); 
    } 
} 

function runningStatus(flow) 
{ 
    //do something 
} 

function abortedStatus(flow) 
{ 
    //do something 
} 
+0

Javascript, в клиентах (browers) и серверах (node.js), не относится к вещам, которые блокируют выполнение. – seand

+0

, так что нет способа это сделать? – Shaili

ответ

0

Вы должны вызвать оставшийся блок кода после завершения операции вам базы данных.

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

Я попытался изменить код следующим образом: после завершения операции с базой данных вы можете вызвать функцию со следующим значением i.

var flow_completed_percentage=0; 
function setFlowStatus() 
{ 
    var flow_name,flow_status_value; 
    var initial = 0; 
    iterator(initial); // initial call 

    function iterator(i) 
    { 
     flow_name=flow_name_DB[i].trim();//flow_name_DB is an array that stores the flow names 
     flow_status_value=flow_status_DB[i].trim();//flow_status_DB is an array that stores the flow status values 

     if(flow_status_value=="R" || flow_status_value=="A") 
     { 
      var invocationData_totalPercentage = { 
       adapter : "dummy_adapter", 
       procedure : "getJobPercentage", 
       parameters : [flow_name] 
      }; 

      WL.Client.invokeProcedure(invocationData_totalPercentage, { 
      onSuccess : function() { 
       setPercentageSuccess(); 
       iterateNext(i); // call next after DB completion 
       }, 
      onFailure : function() { 
       setPercentageFailure(); 
       iterateNext(i); // call next after DB completion 
       }   
      }); 
     } 
    } 

    function iterateNext(current) 
    { 
     current= current+1; 
     if(current<2){ // check the loop condition 
      iterator(current); 
     } 
    } 

    function setPercentageSuccess(total_percentage) 
    { 
     var tot_percent = total_percentage.invocationResult.resultSet[0]; 
     flow_completed_percentage=tot_percent.TOT_PERCENT; 
     if(flow_status=="R") 
     runningStatus(flow_name); 
     else if(flow_status=="A") 
     abortedStatus(flow_name); 
    } 

    function setPercentageFailure() 
    { 
     alert("Failed to fetch records from DB"); 
    } 
} 

function runningStatus(flow) 
{ 
    //do something 
} 

function abortedStatus(flow) 
{ 
    //do something 
} 
+0

Да, я вызываю оставшийся блок кода после завершения операции с базой данных. Проблема заключается в том, что у меня есть цикл for, который позволяет использовать функцию DoMyThing(), и следующая итерация выполняется до завершения вызова базы данных. Я могу заблокировать это? – Shaili

+0

Вам нужно опубликовать хотя бы псевдокод, чтобы я мог понять поток. Без этого трудно угадать проблему. – wonderbell

+0

Я отредактировал мой вопрос .. если вам нужно что-нибудь еще, пожалуйста, дайте мне знать – Shaili

Смежные вопросы