菜鸟教程小白 发表于 2022-12-11 21:46:31

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


                                            <p><p>我正在使用一个名为 <a href="https://github.com/wendux/DSBridge-IOS" rel="noreferrer noopener nofollow">DSBridge</a> 的包。将移动应用程序(在本例中为 iOS 代码)连接到包含我的应用程序主要逻辑的 javascript 代码。这涉及在不可见的 WKWebView 上运行 JavaScript。 </p>

<p>我的 JavaScript 代码需要调用 nativeiOS 应用程序中的一个方法,该方法需要异步执行(为了不阻塞 UI),为此我在 JavaScript 中使用回调,在 native 中使用 completionHandler。</p>

<p>我的 Objective C 函数显示:</p>

<p><code>- (void)read:(NSDictionary *) args :(JSCallback) completionHandler{
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void){
      NSLog(@"读取中");
      而( self ->连接!= NULL){
            if() {
                ;
                NSLog(@"ViewController 收到消息");
                completionHandler(, YES);
            }
      }
    });
}</code></p>

<p>这里是从我的 JavaScript 调用的:</p>

<pre><code>function read() {
    data = &#34;reading&#34;;
    dsBridge.call(&#34;read&#34;, data, function (read_result) {
      console.log(&#34;read_result = &#34;, read_result)
      return read_result;
      });
}
</code></pre>

<p>问题在于 JavaScript,一旦 Native 应用程序返回消息,我需要 JavaScript 函数“read”返回值“read_result”。现在我的代码正在调用 Objective-C ,它正在正确执行并将所需的值返回给 JavaScript 中的回调函数,但 JavaScript 函数“读取”已经完成,没有返回值。 </p>

<p>有没有办法让我停止 JavaScript 直到回调完成?</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>您可以将回调传递给 <code>read()</code> 函数,并在底层 Objective-C 代码返回时调用它</p>

<pre><code>function read(clb) {
data = &#34;reading&#34;;
dsBridge.call(&#34;read&#34;, data, function (read_result) {
    clb(read_result);
});
}
</code></pre>

<p>和你的来电者</p>

<pre><code>read(res =&gt; {
//result available here
console.log(res);
})
</code></pre>

<p>也可以使用 Promise</p>

<pre><code>function read() {
data = &#34;reading&#34;;
return new Promise(resolve =&gt; {
    dsBridge.call(&#34;read&#34;, data, function (read_result) {
      resolve(read_result);
    });
});
}
</code></pre>

<p>和调用者</p>

<pre><code>read()
.then(res =&gt; {
   //result available here
      console.log(res);
   })
</code></pre></p>
                                   
                                                <p style="font-size: 20px;">关于javascript - 让回调在 JavaScript 中同步工作,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/54186858/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/54186858/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: javascript - 让回调在 JavaScript 中同步工作