Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/371.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从evaluateJavaScript函数的完成处理程序返回HTML字符串_Javascript_Html_Swift_Webkit_Completionhandler - Fatal编程技术网

从evaluateJavaScript函数的完成处理程序返回HTML字符串

从evaluateJavaScript函数的完成处理程序返回HTML字符串,javascript,html,swift,webkit,completionhandler,Javascript,Html,Swift,Webkit,Completionhandler,我知道我不是第一个问这个问题的人,但我解决不了这个问题。我试图在Xcode with Swift 3中使用evaluateJavaScript从HTML中提取一段字符串,该段文本在完成处理程序中被称为value,因此我这样做: var userName = String() func takeData() { webView.evaluateJavaScript("document.querySelectorAll('.name')[0].innerHTML") { (v

我知道我不是第一个问这个问题的人,但我解决不了这个问题。我试图在Xcode with Swift 3中使用
evaluateJavaScript
从HTML中提取一段字符串,该段文本在完成处理程序中被称为
value
,因此我这样做:

var userName = String()

   func takeData() {
        webView.evaluateJavaScript("document.querySelectorAll('.name')[0].innerHTML") { (value, error) in

            if let valueName = value as? String {
                self.userName = valueName
            }
            print(value)
            print(error)
        }

    }

print(" The name is : \(self.userName)") 
takeData(completionHandler: { userName in
    print(userName)
})

问题是控制台只是打印:名称是()

问题是在异步函数完成执行之前打印值。您有几种解决此问题的方法。您可以实现
takeData
将completionHandler作为其输入参数之一,使用
GCD
使语句按预期顺序执行,或者使用第三方库,例如为您处理异步请求,以便它们的行为类似于具有返回值的正常函数

我将为您提供一个关于完成处理程序的示例:

func takeData(completionHandler: @escaping (_ userName: String?) -> Void){
    webView.evaluateJavaScript("document.querySelectorAll('.name')[0].innerHTML") { (value, error) in
        if let valueName = value as? String {
            completionHandler(valueName)
        }
        print(value)
        print(error)
        completionHandler(nil)
    }
}
您可以使用completionHandler中的值,如下所示:

var userName = String()

   func takeData() {
        webView.evaluateJavaScript("document.querySelectorAll('.name')[0].innerHTML") { (value, error) in

            if let valueName = value as? String {
                self.userName = valueName
            }
            print(value)
            print(error)
        }

    }

print(" The name is : \(self.userName)") 
takeData(completionHandler: { userName in
    print(userName)
})

是否在webview完成加载后调用?