javascript - 让回调在 JavaScript 中同步工作

标签 javascript ios objective-c webview

我正在使用一个名为 DSBridge 的包将移动应用程序(在本例中为 iOS 代码)连接到包含我的应用程序主要逻辑的 javascript 代码。这涉及在不可见的 WKWebView 上运行 JavaScript。

我的 JavaScript 代码需要调用 native iOS 应用程序中需要异步执行的方法(为了不阻塞 UI),为此我在 JavaScript 中使用回调,在 native 中使用 completionHandler。

我的 Objective C 函数如下:

- (void)read:(NSDictionary *) args :(JSCallback) completionHandler{ dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void){ NSLog(@"已读"); while(self->connection != NULL) { if([self->connection isMessageAvailable]) { [self->connection messageRetrieved]; NSLog(@"在 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”在 Native 应用程序返回消息后返回值“read_result”。现在我的代码正在调用 Objective-C ,它正在正确执行并将所需的值返回给 JavaScript 中的回调函数,但 JavaScript 函数“读取”已经完成但没有返回值。

有没有办法让我暂停 JavaScript,直到回调完成?

最佳答案

您可以将回调传递给 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);
})

或者使用 Promise

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);
   })

关于javascript - 让回调在 JavaScript 中同步工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54186858/

相关文章:

objective-c - 何时设置 Audio Session 属性

javascript - Google pagespeed 显示渲染阻塞,甚至进入 body 部位

iphone - 如何在UIWebview上显示.asmx页面?

objective-c - XCode:应用程序->iPod 运行/构建不上传应用程序

objective-c - 存储大量键值对的正确解决方案是什么? NSDictionary 与 DB

android - 如何始终检查抖动中的互联网连接

iphone - 在 UIView 中存储额外的关联信息

javascript - 如果元素旋转,FireFox 中的 CSS 宽度过渡断断续续

javascript - 简单的仪表板应用程序

javascript - 如何在弹出的警报中添加声音?