什么'这是让函数返回等待异步操作完成的最佳方法
What's the best way to get a function return to wait until an asynchronous operation has finished?
给定以下原型函数:
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
的异步内容完成。
函数需要接受回调参数
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在评论中提到的那样,只有在实际发生异步操作的情况下,这才有效。示例包括通过网络访问信息或访问磁盘。
相关文章:
- 如何指示“;熟度;在异步操作中
- 使用jquery更改异步操作中的文本值
- 节点.js中的嵌套异步操作
- 阻止chrome.webRequest.onBeforeSendHeaders侦听器中的异步操作
- 节点.js和表达式:如何在异步操作后返回响应
- 无法在Redux中测试异步操作
- 当我在异步操作Redux上开始单元测试时,没有定义错误承诺
- 循环中的异步操作
- 回流如何侦听异步操作已完成
- 我们可以使用Jasmine在测试中执行异步操作吗
- jQuery:如何检查以确保所有异步操作都已完成
- JavaScript ES6 承诺在 while 循环中调用异步操作
- 请等待异步操作 (firebase) 调用完成,然后再加载网页
- 具有 Javascript 同步接口的异步操作
- 如何在异步操作期间使 Express.js 日志错误
- 如何在 $ 中执行异步操作.延迟,然后失败过滤回调并传递回成功链
- 什么'这是让函数返回等待异步操作完成的最佳方法
- ExtJS 4拖放等待异步操作,然后再决定是否完成拖放
- 我们怎么能知道所有的异步操作,所有的回调都完成了,并等待它们
- 在调用其他模块之前,请等待异步操作