Promise如何使用?全方位解析,一篇搞懂异步

简介: Promise如何使用?全方位解析,一篇搞懂异步

目录


什么是异步?


什么情况下用到promise?


promise所有回调参数


赋值写法


链式调用


promise.all


在函数中 return 一个 promise


用ajax网络请求配合 promise使用:


异步中的微任务队列


什么是异步?

异步:操作之间没啥关系,同时进行多个操作,操作之间不会有干扰(可以先往下执行,回头再执行上面的),代码复杂


同步:同时只能做一件事,上面数据执行完之后才能进行下个操作(从上到下),代码简单


什么情况下用到promise?

   一般情况下是有异步操作时,使用Promise对这个异步操作进行封装

    new ->构造函数(1.保存了一些状态信息 2.执行传入的函数)

    在执行传入的回调函数时,会传入两个函数:resolve,reject  这两个本身又是函数

    Promise将网络请求和最终处理代码进行分离

promise所有回调参数

resolve(value) — 如果任务成功完成并带有结果 value


reject(error) — 如果出现了 error,error 即为 error 对象。


异步任务顺利完成且返回结果值时,会调用 resolve 函数;而当异步任务失败且返回失败原因(通常是一个错误对象)时,会调用reject 函数


promise.then()成功调用


promise.catch() 失败调用   (这个有点像try..catch,不懂的可以点击蓝字去看哦)


promise.finally()成功失败都调用


赋值写法

let promise = new Promise(function(resolve, reject) {
  setTimeout(() => resolve("咚!"), 1000);
});
// resolve 运行 .then 中的第一个函数
promise.then(
  result => alert(result), // 1 秒后显示 "咚!"
  error => alert(error) // 不运行
);
//或者
promise.then(alert); // 1 秒后显示 "咚!"

可以看到上面then有两个参数:

.then 的第一个参数是一个函数,该函数将在resolved 后运行并接收结果。

.then 的第二个参数也是一个函数,该函数将在 rejected 后运行并接收 error。

链式调用

自上到下挨着执行

new Promise(function(resolve, reject) {
  setTimeout(() => resolve(1), 1000); 
}).then(function(result) { 
  alert(result); // 打印1
  return result * 2;
}).then(function(result) { 
  alert(result); // 打印2
  return result * 2;
})

promise.all

promise.all这个方法返回一个新的promise对象,该promise对象在iterable参数对象里所有的promise对象都成功的时候才会触发成功,否则返回失败

常用技巧:

1.let urls = [
  'https://api.github.com/1',
  'https://api.github.com/2',
  'https://api.github.com/3'
];
// 将每个 url 映射(map)到 fetch 的 promise 中
let requests = urls.map(url => fetch(url));
// Promise.all 等待所有任务都 resolved成功
Promise.all(requests)
  .then(responses => console.log(responses)
  ));
//会输出数组形式的这几个链接
//[https://api.github.com/1,https://api.github.com/2,https://api.github.com/3]

在函数中 return 一个 promise

1.function promisify(f) {
    return new Promise((resolve, reject) => {
        if (err) {
          reject(err);
        } else {
          resolve(result);
        }
    })
}
// 用法:
let Promises = promisify(参数);
Promises(...).then(...);

附上MDN的关系图:

image.png

用ajax网络请求配合 promise使用:

1.    function createPromise(url) {
      // resolve成功   reject失败
      return new Promise(function (resolve, reject) {
        $.ajax({
          //  es6简写
          url,
          dataType: 'json',
          success(arr) {
            resolve(arr);
          },
          error(err) {
            reject(err)
          },
        })
      });
    }
    // 同时满足返回成功
    Promise.all([
      createPromise('./arr.txt'),
      createPromise('./json.txt')
      // then然后的意思,then(function(){},function(){}),第一个返回成功,第二个函数失败
    ]).then(function (arr) {  
      // 解构赋值
      // res1是第一个链接,res2是第二个链接
      let [res1, res2] = arr;
      alert('全部成功');
      alert(res1);
      alert(res2);
    }, function () {
      alert('至少有一个失败了')
    }
/* then有两个参数第一个参数是一个函数,该函数将在resolved 后运行并接收结果。
                第二个参数也是一个函数,该函数将在 rejected 后运行并接收 error。*/


异步中的微任务队列

只有在 JavaScript 引擎中执行完任务时,才开始执行任务队列中的任务。


队列(queue)中也是按先后顺序执行的,首先进入队列的任务会首先运行。


当一个 promise 准备就绪时,它的then/catch/finally处理程序就会被放入队列中:但是它们不会立即被执行。当 JavaScript 引擎执行完当前的代码,它会从队列中获取任务并执行它。


下面代码会先执行同步代码:


let promise = Promise.resolve();
promise.then(() => alert("2"));
alert("1"); // 这个 1 先显示

如果我们需要确保一段代码在异步之后被执行,我们可以将它添加到链式调用的 .then

最后挑一种自己喜欢的方式书写就可以了,我刚开始看的时候也有点蒙蔽,其实就是为了从各个角度介绍promise,自己有个大概了解之后,用起来更顺手哦

相关文章
|
存储 前端开发
除了 Promise.all(),还有哪些方法可以处理异步并发操作?
在上述示例中,`concurrentPromises` 函数接受一个Promise数组和最大并发数作为参数,通过手动控制并发执行的Promise数量,实现了对异步操作的并发控制,并在所有Promise完成后返回结果数组。
|
前端开发 JavaScript
如何使用 Promise 处理异步并发操作?
通过使用 `Promise.all()` 和 `Promise.race()` 方法,可以灵活地处理各种异步并发操作,根据不同的业务需求选择合适的方法来提高代码的性能和效率,同时也使异步代码的逻辑更加清晰和易于维护。
|
前端开发 数据处理
如何使用 Promise.all() 处理异步并发操作?
使用 `Promise.all()` 可以方便地处理多个异步并发操作,提高代码的执行效率和可读性,同时通过统一的 `.catch()` 方法能够有效地处理异步操作中的错误,确保程序的稳定性。
|
前端开发 JavaScript 开发者
用 Promise 处理异步操作的优势是什么?
综上所述,使用Promise处理异步操作能够有效地解决传统回调函数带来的诸多问题,提高代码的质量、可读性、可维护性和可扩展性,是JavaScript中进行异步编程的重要工具和技术。
|
8月前
|
消息中间件 JavaScript 前端开发
最细最有条理解析:事件循环(消息循环)是什么?为什么JS需要异步
度一教育的袁进老师谈到他的理解:单线程是异步产生的原因,事件循环是异步的实现方式。 本质是因为渲染进程因为计算机图形学的限制,只能是单线程。所以需要“异步”这个技术思想来解决页面阻塞的问题,而“事件循环”是实现“异步”这个技术思想的最主要的技术手段。 但事件循环并不是全部的技术手段,比如Promise,虽然受事件循环管理,但是如果没有事件循环,单一Promise依然能实现异步不是吗? 博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您
|
JSON 前端开发 JavaScript
在 JavaScript 中,如何使用 Promise 处理异步操作?
通过以上方式,可以使用Promise来有效地处理各种异步操作,使异步代码更加清晰、易读和易于维护,避免了回调地狱的问题,提高了代码的质量和可维护性。
|
数据处理 Python
深入探索:Python中的并发编程新纪元——协程与异步函数解析
深入探索:Python中的并发编程新纪元——协程与异步函数解析
144 3
|
前端开发 JavaScript
解决异步问题,教你如何写出优雅的promise和async/await,告别callback回调地狱!
该文章教授了如何使用Promise和async/await来解决异步编程问题,从而避免回调地狱,使代码更加清晰和易于管理。
解决异步问题,教你如何写出优雅的promise和async/await,告别callback回调地狱!
|
前端开发 JavaScript
Vue 中 Promise 的then方法异步使用及async/await 异步使用总结
Vue 中 Promise 的then方法异步使用及async/await 异步使用总结
515 1
|
数据处理 Python
深入探索:Python中的并发编程新纪元——协程与异步函数解析
【7月更文挑战第15天】Python 3.5+引入的协程和异步函数革新了并发编程。协程,轻量级线程,由程序控制切换,降低开销。异步函数是协程的高级形式,允许等待异步操作。通过`asyncio`库,如示例所示,能并发执行任务,提高I/O密集型任务效率,实现并发而非并行,优化CPU利用率。理解和掌握这些工具对于构建高效网络应用至关重要。
202 6

推荐镜像

更多
  • DNS