什么是使函数返回等待异步操作完成的最佳方法?

时间:2014-11-10 00:09:49

标签: javascript asynchronous

给出以下原型函数:

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的异步内容完成为止。

1 个答案:

答案 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在评论中提到的那样,只有在实际发生异步操作时才会起作用。示例包括通过网络访问信息或访问磁盘。