理解javascript承诺对象

AL-*_*ami 18 javascript promise

我试图在javascript中包围promise对象.所以我在这里有一小段代码.我有一个promise对象和两个console.log()在promise对象的两边.我以为它会打印

你好

那里

zami

但它打印出来了

HI

zami

there
Run Code Online (Sandbox Code Playgroud)

为什么它就像那样.我对如何工作没有任何理解,但我理解异步回调在javascript中是如何工作的.任何人都可以对这个主题有所了解吗?

console.log('hi');
var myPromise = new Promise(function (resolve, reject) {
    if (true) {
        resolve('There!');
    } else {
        reject('Aww, didn\'t work.');
    }
});

myPromise.then(function (result) {
    // Resolve callback.
    console.log(result); 
}, function (result) {
    // Reject callback.
    console.error(result);
});
console.log('zami');
Run Code Online (Sandbox Code Playgroud)

Alb*_*era 16

Promise执行是异步的,这意味着它已被执行,但程序不会等到它完成后继续使用其余的代码.

基本上,您的代码执行以下操作:

  1. 记录'嗨'
  2. 创造一个承诺
  3. 执行承诺
  4. 记录'zami'
  5. 承诺得到解决并记录'那里'.

如果你想要它打印'嗨那里,zami',你将不得不

myPromise.then(function (result) {
    // Resolve callback.
    console.log(result); 
    console.log('zami');
}, function (result) {
    // Reject callback.
    console.error(result);
});
Run Code Online (Sandbox Code Playgroud)


Wil*_*een 9

摘要:

Javascript中的promise是一个对象,代表异步操作的最终完成或失败。承诺代表了某个价值的代理,该价值在将来的某个时候会越来越流行。

一个承诺可以具有以下三种状态:

  1. 待处理:这是诺言的初始状态,诺言现在正在等待解决或被拒绝。例如,当通过AJAX请求与网络联系并将请求包装在Promise中时。然后,承诺将在不返回请求的时间窗口中挂起。
  2. 已实现:成功完成操作后,诺言就会兑现。例如,当我们使用AJAX获取一些JSON数据并将其包装在Promise中进行网络连接时。当我们成功取回数据时,承诺就兑现了。
  3. 拒绝:操作失败时,承诺将被拒绝。例如,当我们使用AJAX获取一些JSON数据并将其包装在Promise中进行网络连接时。当我们收到404错误时,承诺已被拒绝。

承诺构造函数:

我们可以通过以下方式创建承诺:

let prom = new Promise((res, rej) => {
  console.log('synchronously executed');
  if (Math.random() > 0.5) {
    res('Success');
  } else {
    rej('Error');
  }
})


prom.then((val) => {
  console.log('asynchronously executed: ' + val);
}).catch((err) => {
  console.log('asynchronously executed: ' + err);
}).finally(() => {
  console.log('promise done executing');
});


console.log('last log');
Run Code Online (Sandbox Code Playgroud)

兴趣点:

  • promise构造函数中的代码是同步执行的。
  • then方法将回调作为第一个参数,该回调在实现诺言时异步执行。
  • then方法以第二个参数作为回调,该回调 在承诺被拒绝时异步执行。但是,我们通常catch为此使用方法(因为它比较冗长),该方法还接受了一个在答应拒绝时异步执行的回调 。catch基本上与相同then(null, failCallback)
  • then回调接收作为第一个参数的解析值(在这种情况下,字符串“成功”)。
  • catch回调接收作为第一个参数的否决值(字符串在这种情况下“错误”)。
  • finally方法接收一个回调,该回调在promise实现和拒绝上执行。在这里,我们可以编写“清除”代码,无论承诺结果如何,该代码都必须始终执行。

你的例子:

在您的代码中,“ Zami”被打印在“ there”之前,因为记录“ there”的日志位于then回调函数中。前面我们指出,这些回调是异步执行的,因此将在最后执行。


Uni*_*der 6

我建议您了解事件循环在 JavaScript 中的工作原理。

花点时间观看此视频。

它会消除你的疑虑。 在此输入图像描述

  • 非常感谢。观看了视频。这非常有帮助。 (3认同)

Aar*_*ius 5

即使您同步解决了promise,您传入的处理程序也会then被异步调用。这是根据定义的规范

onFulfilled和onRejected异步执行,在事件循环回合之后被调用,并使用新堆栈