提问者:小点点

理解JavaScript promise对象


我正在尝试用JavaScript来研究promise对象。 这里我有一小段代码。 我有一个promise对象,在promise对象的两侧有两个console.log()。 我以为它会印出来

那里

扎米

但它是印刷的

HI

zami

there

为什么会这样? 我对promise是如何工作的理解为零,但我了解异步回调在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');

共3个答案

匿名用户

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

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

  1. 记录“嗨”
  2. 创建承诺
  3. 履行承诺
  4. 记录“zami”
  5. 承诺已解析并记录“存在”。

如果你想让它印上“你好,扎米”,你必须这样做

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

匿名用户

Javascript中的promise是表示异步操作最终完成或失败的对象。 承诺表示一个值的代理,该值将在未来的某个时间点得到。

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

  1. 挂起:这是承诺的初始状态,承诺现在正在等待解决或拒绝。 例如,当使用AJAX请求到达web并将请求包装在承诺中时。 则承诺将在请求未返回的时间窗口内挂起。
  2. 已实现:当操作成功完成时,承诺已实现。 例如,当我们使用AJAX获取一些JSON数据并将其包装在Promise中时,我们就可以使用web。 当我们成功地获取回数据时,承诺就被认为实现了。
  3. 拒绝:当操作失败时,拒绝承诺。 例如,当我们使用AJAX获取一些JSON数据并将其包装在Promise中时,我们就可以使用web。 当我们收到404错误时,承诺已被拒绝。

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

null

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');

匿名用户

即使您是同步解析承诺的,您传递给然后的处理程序也会异步调用。 这是根据定义的规范:

OnFullished和onRejected在调用then的事件循环之后异步执行,并使用新堆栈