账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    关于 js 并发请求数据的问题
    25
    0

    写一个简化的代码

    const ids = [1, 2, 3]
    const resArr = []
    // 1
    ids.forEach(id => api(id).then(res => resArr.push(res))
    // 2
    Promise.all(ids.map(id => api(id).then(res => resArr.push(res))))

    api 是使用来发送 http 请求的一个方法,里面会把 id 拼接到一个特定的地址后面,返回值是一个 promise,请求到数据之后在 then 里面把结果写入到 resArr。

    我本来的想法是用 forEach 实现并发请求,也就是方法1,但是后来用 Promise.all 写了一个,也就是方法2,我不知道这两种方法哪种更好,或者,在性能上有什么差别,按我的理解看起来没有什么区别,而且每一次 http 请求我都不需要关心成功与否,也就是说失败是可以接受的,所以 Promise.all 虽然会在全部成功或者某一个失败的时候通知我,但是我不需要关心这些

    0
    打赏
    收藏
    点击回答
        全部回答
    • 0
    • 落叶满屋 普通会员 1楼

      在 JavaScript 中,我们可以使用 Promises 或者 async/await 来处理并发请求数据。以下是一个使用 Promises 的例子:

      ```javascript function fetchData(url, callback) { return new Promise((resolve, reject) => { const xhr = new XMLHttpRequest(); xhr.open('GET', url, true); xhr.onload = () => { if (xhr.status === 200) { resolve(xhr.responseText); } else { reject(new Error(xhr.statusText)); } }; xhr.onerror = () => { reject(new Error('Network error')); }; xhr.send(); }); }

      // 使用 Promises fetchData('https://api.example.com/data', (response) => { console.log(response); }); ```

      在这个例子中,我们定义了一个名为 fetchData 的函数,它接受两个参数:一个 URL 和一个回调函数。函数内部使用 XMLHttpRequest 对象发送一个 GET 请求到指定的 URL。如果请求成功,函数会将响应的文本内容传递给回调函数。如果请求失败(例如,网络错误或服务器返回的错误状态码),函数会抛出一个错误。

      我们使用 new Promise 来创建一个异步 Promise,然后通过 resolvereject 方法来处理异步操作的结果。在异步操作成功时,resolve 方法会调用回调函数,将响应的文本内容作为参数传递。如果异步操作失败,reject 方法会调用回调函数,抛出一个错误。

      在主函数 fetchData 中,我们首先创建了一个新的 Promise,然后调用 fetchData 函数,传入一个回调函数作为参数。最后,我们在回调函数中调用 console.log(response) 来打印响应的内容。

      如果我们使用 async/await,我们可以像这样使用 await 关键字:

      ```javascript async function fetchData(url, callback) { try { const response = await fetch(url); if (response.ok) { const data = await response.json(); callback(data); } else { throw new Error(response.statusText); } } catch (error) { callback(error); } }

      // 使用 async/await fetchData('https://api.example.com/data', (response) => { console.log(response); }); ```

      在这个例子中,我们首先使用 async/await 关键字将 fetchData 函数转换为一个 async 函数。然后,我们使用 await 关键字等待 fetchData 函数返回一个 Promise。如果 Promise 成功,我们使用 await response.json() 方法获取响应的数据,并将其传递给回调函数。如果 Promise 失败,我们使用 catch 关键字捕获并处理错误。

    更多回答
    扫一扫访问手机版