Пусть обратный вызов работает синхронно в JavaScript - PullRequest
0 голосов
/ 14 января 2019

Я работаю с пакетом DSBridge для подключения мобильного приложения (в данном случае кода iOS) к коду javascript, содержащему основную логику моего приложения. Это включает в себя запуск JavaScript на невидимом WKWebView.

Мой код JavaScript должен вызывать метод в нативном приложении iOS, которое должно выполняться асинхронно (чтобы не блокировать пользовательский интерфейс), для этого я использую обратные вызовы в JavaScript и завершениеHandler в нативном.

Функция My Objective C гласит:

- (void)read:(NSDictionary *) args :(JSCallback) completionHandler{ dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void){ NSLog(@"In Read"); while(self->connection != NULL) { if([self->connection isMessageAvailable]) { [self->connection messageRetrieved]; NSLog(@"Message Received in ViewController"); completionHandler([self->connection getMessage], YES); } } }); }

Который вызывается из моего JavaScript здесь:

function read() {
    data = "reading";
    dsBridge.call("read", data, function (read_result) {
        console.log("read_result = ", read_result)
        return read_result;
        });
}

Проблема заключается в JavaScript, мне нужна функция JavaScript 'read', чтобы вернуть значение "read_result", как только приложение Native вернет сообщение. Прямо сейчас мой код вызывает целевой объект C, который выполняется правильно и возвращает требуемое значение в функцию обратного вызова в JavaScript, но функция JavaScript «read» уже завершена без возвращаемого значения.

Есть ли способ для меня остановить JavaScript, пока обратный вызов не будет завершен?

1 Ответ

0 голосов
/ 14 января 2019

Вы можете передать обратный вызов функции read() и вызвать ее, когда базовый код Objective-C вернет

function read(clb) {
  data = "reading";
  dsBridge.call("read", data, function (read_result) {
    clb(read_result);
  });
}

и ваш абонент

read(res => {
  //result available here
  console.log(res);
})

В качестве альтернативы с обещаниями

function read() {
  data = "reading";
  return new Promise(resolve => {
    dsBridge.call("read", data, function (read_result) {
      resolve(read_result);
    });
  });
}

и звонящий

read()
  .then(res => {
     //result available here
      console.log(res);
   })
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...