javaScript中的promise

举报
搞前端的半夏 发表于 2022/05/31 21:33:44 2022/05/31
【摘要】 我们在日常的学习中,会经常遇到这样的说法:JavaScript是非阻塞的。JavaScript是一门单线程语言。这就意味着,javaScript一次只能干一件事情。其他支持多线程的语言则可以一次运行多个进程。我们在控制台运行下面的代码!console.log('开始');console.log('结束');意料之中,按顺序输出了开始和结束。如果我们在这中间使用setTimeout等待两秒钟!...

我们在日常的学习中,会经常遇到这样的说法:JavaScript是非阻塞的。JavaScript是一门单线程语言。这就意味着,javaScript一次只能干一件事情。其他支持多线程的语言则可以一次运行多个进程。

我们在控制台运行下面的代码!

console.log('开始');
console.log('结束');

意料之中,按顺序输出了开始和结束。

image-20220531211347972

如果我们在这中间使用setTimeout等待两秒钟!输出的结果呢?

console.log('开始');
setTimeout(function() {
  console.log('等待两秒');
}, 2000);
console.log('结束');

输出的结果是开始-》结束-》等待两秒。和我们预想的不一样啊!他不应该是暂停两秒,输出等待两秒,在输出结束的嘛!

image-20220531211537591

JavaScript并没有按照我们的想法执行。它先解析第一行代码,输出开始。然后解析遇到setTimeout。他会将setTimeout放到一个地方,然后继续解析下面的console。等两秒钟之后,javaSxript会继续执行setTimeout。这就是调用堆栈

promise

你可以将Promise看作是一个承诺!上面写着:我十分钟后会拿到我点的餐!

我们将这个改造成函数。

function bugFood() {
  const foodPromise  = new Promise();
  return foodPromise;
}

Promise是立即做出的,但是我们的饭并不会立即拿到!

当我们做出承诺后,该如何去拿到我们的餐。这里有两个回调函数!

Promise 接受一个回调函数,该回调函数将给我们 2 个参数:

  1. resolve
  2. reject
      function bugFood() {
        const foodPromise = new Promise(function (resolve, reject) {
          resolve("拿到饭了");
        });
        return foodPromise;
      }
      const food = bugFood();
console.log(food);

我们在控制台执行这段代码,我们会得到我们的饭吗?还是仍然得到承诺!

image-20220531212836468

很遗憾,我们并没有拿到我们的饭!这是因为,我们只是告诉服务员,我们有一个resolve方法,我要通过这个方法拿到我们的饭!但是,此时,我们并没有真正的去服务员那里拿饭。

我们想要去拿饭,就要动起来。then就是我们做出承诺后,如何动起来。

    food.then(function (food) {
        console.log("我去拿饭了");
        console.log(food);
      });

此时,我们才真正的拿到我们的饭!

image-20220531213204408

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。