js 封装一个简单的异步API,获取异步操作结果

原文地址:https://www.cnblogs.com/Grani/p/9588221.html

平常在封装一个同步的函数时,我们只需要在函数中 return 结果就可以了。
像这样:

function fn () {
 var data = 'hello';
 return data;
}
var data = fn();
console.log(data) //输出 : hello

js 中的异步操作:
❶ 定时器
❷ 事件绑定
❸ ajax异步模式
❹ 回调函数

如何获取一个函数中异步操作的结果,例如调用函数 fn() 得到内部变量 data 的值:
(1)

function fn() {
  setTimeout(function () {
      var data = 'Hi'
   },1000)
  console.log(data)
}
fn()

由于定时器 1 秒后才执行,但代码早已执行到了 console,所以输出结果为 data is not defined

(2)

function fn() {
    setTimeout(function () {
        var data = 'Hi'
        return data
    },1000)
}
console.log(fn())

fn 函数没有返回值,所以输出结果为 undefined
return 是定时器里的那个 function 进行 return 的,与 fn 无关

(3)

var data = '^_^'
function fn() {
    setTimeout(function () {
        data = 'Hi'
    },1000)
    return data
}
console.log(fn())

定时器是异步的,所以代码不等待,会直接执行到 return,赋值操作没有执行,所以结果为 _

正确方式

如果需要获取一个函数中异步操作的结果,则必须通过回调函数来获取

function fn(callback) {
    //传入一个函数,就相当于在这创建了一个叫callback的函数
    //var callback = function (data) { console.log(data) }
    setTimeout(function () {
        var data = 'Hi'
        callback(data)
    },1000)
}
fn(function (data) {
    console.log(data)
})

关键的一步是在定时器内调用 callback ,前面的情况之所以拿不到数据是因为,data 变量在定时器内定义,函数不等定时器里的 function 执行就立马想拿到数据,就是人家产品都没做好你就来提货,这显示是不行的

现在 callback 在定时器的 function 里执行,并且是在 data 变量初始化后才执行,就保证能拿到数据,即便定时器是10秒甚至一分钟都没关系,反正都是等 data 初始化后才执行 callback
也就是说,当真正执行了setTimeout里面的函数时,如果调用了callback函数,那么就可以调用执行fn的回调函数callback,从而达成传递异步结果的目的


还有种方式可以获取 data 的值,就是将其定义为全局变量,定时器一秒后执行,那就两秒后进行调用,但此方式没有意思

var data
function fn() {
    setTimeout(function () {
        data = 'Hi'
    },1000)
}
fn()

setTimeout(function () {
    console.log(data)  //两秒后结果为Hi,若将2000改为0,结果为undefined
},2000)
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
假设已经有多个封装好的API,每个API返回的数据格式相同,都是一个包含多个对象的数组。可以使用Vue.js异步组件和Promise.all()方法来获取并合并这些API的数据。 首先,在Vue组件的data属性中定义一个空数组来存储所有API返回的数据: ```javascript data() { return { allData: [] } } ``` 然后,在Vue组件的mounted生命周期钩子函数中,使用Promise.all()方法来获取所有API的数据,并将它们合并到allData数组中: ```javascript mounted() { const api1 = getApi1Data() const api2 = getApi2Data() const api3 = getApi3Data() Promise.all([api1, api2, api3]).then(results => { this.allData = results.reduce((acc, data) => acc.concat(data), []) }) } ``` 上述代码中,getApi1Data()、getApi2Data()和getApi3Data()是封装好的API函数,它们返回一个Promise对象,该对象解析为一个包含多个对象的数组。Promise.all()方法接收一个Promise对象数组,等待所有Promise对象都解析后返回一个新的Promise对象,该对象解析为一个包含所有Promise对象解析结果的数组。然后,使用reduce()方法将所有API返回的数据合并到allData数组中。 最后,在Vue组件的模板中使用v-for指令渲染allData数组中的数据: ```html <template> <ul> <li v-for="data in allData" :key="data.id"> {{ data.name }} </li> </ul> </template> ``` 上述代码中,v-for指令用于循环渲染allData数组中的每个对象,使用:data.id作为key值来提高渲染效率。在li元素中,使用{{ data.name }}来显示每个对象的名称属性。 完整代码如下: ```javascript <template> <ul> <li v-for="data in allData" :key="data.id"> {{ data.name }} </li> </ul> </template> <script> export default { data() { return { allData: [] } }, mounted() { const api1 = getApi1Data() const api2 = getApi2Data() const api3 = getApi3Data() Promise.all([api1, api2, api3]).then(results => { this.allData = results.reduce((acc, data) => acc.concat(data), []) }) } } </script> ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值