给出以下原型函数:
Client.prototype.getLocalIp = function() {
var rtc = new window.RTCPeerConnection({iceServers: []});
rtc.createDataChannel('', {reliable: false});
var that = this;
rtc.onicecandidate = function(event) {
if (event.candidate) {
that.localIp = grep(event.candidate.candidate);
}
};
rtc.createOffer(function (offer) {
that.localIp = grep(offer.sdp);
rtc.setLocalDescription(offer);
}, function (error) {
console.warn('Fetching local IP failed', error);
});
var grep = function(sdpOrCandidate) {
// Does lots of string processing stuff and returns a string
}
console.log("Returning from function");
console.log(this.localIp);
}
如何在grep
函数完成业务并返回值之前停止函数返回?这是一个JSFiddle,展示了我的意思:http://jsfiddle.net/tjkxcL1j/
如果查看浏览器控制台,您应该会看到getLocalIp()
函数首先返回null,直到rtc.onicecandidate
和/或rtc.createOffer
的异步内容完成为止。
答案 0 :(得分:0)
您的函数需要接受回调参数
Client.prototype.getLocalIp = function getLocalIp(done) {
// ...
rtc.createOffer(function (offer) {
that.localIp = grep(offer.sdp);
rtc.setLocalDescription(offer);
// call the callback here
done(null, that.localIp);
},
function (error) {
console.warn('Fetching local IP failed', error);
// call the callback with an error here
done(error);
});
};
然后你可以像这样使用它
client.getLocalIp(function(err, ip){
if (err) return console.error(err.message);
console.log("client ip", ip);
});
但是,正如@zerkms在评论中提到的那样,只有在实际发生异步操作时才会起作用。示例包括通过网络访问信息或访问磁盘。