欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

异步编程,回调函数

程序员文章站 2024-01-28 09:35:46
...

9.异步编程

回调函数

不成立的情况1:

function add(x, y) {
   console.log(1)
   setTimeout(function () {
   		console.log(2)
        var ret = x + y
   	    return ret
   }, 1000)
   console.log(3)
   //到这里执行就结束了,不会等到前面的定时器,所以直接返回了默认值undefined
 }
  console.log(add(10, 20))
//1,3,undefined,2

不成立的情况2:

function add(x, y) {
    var ret
   console.log(1)
   setTimeout(function () {
   		console.log(2)
        ret = x + y
   }, 1000)
   console.log(3)
    return ret
   //到这里执行就结束了,不会等到前面的定时器,所以直接返回了默认值undefined
 }
  console.log(add(10, 20))
//1,3,undefined,2

成立的情况(麻烦):

var ret
function add(x, y) {
   console.log(1)
   setTimeout(function () {
   		console.log(2)
        ret = x + y
   }, 1000)
 }
add(10, 20)
setTimeout(function(){
    console.log(ret)
},1000)
//1,2,30要等一秒才会出来  add在定时函数之前

回调函数:

function add(x, y, callback) {
  console.log(1)
    //setTimeout异步操作
  setTimeout(function () {
    var ret = x + y
    callback(ret)
  }, 1000)
}
add(10, 20, function (ret) {
  console.log(ret)
})

注意:凡是需要得到一个函数内部异步操作的结果
setTimeout readFile writeFile ajax
这种情况必须通过:回调函数

基于原生XMLHttpRequest封装get方法:

 function get(url, callback) {
      var oReq = new XMLHttpRequest()
      // 当请求加载成功之后要调用指定的函数
      oReq.onload = function () {
        // 我现在需要得到这里的 oReq.responseText
        callback(oReq.responseText)
      }
      oReq.open("get", url, true)
      oReq.send()
    }

    get('data.json', function (data) {
      console.log(data)
    })