2016-11-07 2 views
-1

Я использую GWT, и у меня есть одна нативная функция, называемая классом Java, у которой есть некоторый код, для получения результата и возврата обратно к java-коду потребуется несколько секунд. Но, к сожалению, он возвращается пустым из-за возвращения родной функции раньше, чем ответ на внутренний ответ службы.Возвращение JSNI после таймаута

Вот код

Эта функция вызывается из класса Java.

public static native String getChartPng(int indexing)/*-{ 
     var result; 
     //getPngBase64String(onSuccess, onError, width, height, img quality) 
     if($wnd.chartings[indexing]){ 
      $wnd.chartings[indexing].getPngBase64String(function(response){ 
       //it takes couple of seconds 
       result = response; 

      },null,450,600,1); 
     } 
     return result 
    }-*/; 

Так что, когда я назвал эту функцию, я получил пустую строку. Как я получил результат от использования этого кода?

ответ

1

Я думаю, вы используете AnyChart. Вот getPngBase64String reference.

Этот метод является асинхронным, что означает, что выполнение кода продолжается, не дожидаясь завершения этого метода. Вот почему следующее заявление: return result вызывается немедленно, с неназначенным result.

Метод getPngBase64String в первых двух параметрах принимает функции обратного вызова, вызываемые при завершении выполнения метода (первый обратный вызов) или сбое (второй обратный вызов). Результат можно использовать только в обратном вызове onSuccess.

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

Таким образом, вы не можете просто вернуть результат. Вместо этого вы должны сделать что-то с результатом в функции обратного вызова.

+0

Да, я использую anychart, я знаю это решение, выполняю любую внутреннюю функцию обратного вызова, но хочу вернуть это значение ... –

0

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

Вы можете использовать некоторый флаг, чтобы ждать результата. Как это:

public static native String getChartPng(int indexing) /*-{ 
    var result_ready = false; 
    var result; 
    //getPngBase64String(onSuccess, onError, width, height, img quality) 
    if($wnd.chartings[indexing]){ 
     $wnd.chartings[indexing].getPngBase64String(function(response){ 
      //it takes couple of seconds 
      result = response; 
      result_ready = true; 
     }, null, 450, 600, 1); 
    } 

    while(!result_ready); // do nothing, wait for the result - notice the `;` 

    return result 
}-*/; 

Это называется busy waiting и вы должны избегать этого.