javascript - 理解 JavaScript promise 对象

标签 javascript promise

我正在努力思考 JavaScript 中的 promise 对象。所以这里我有这段代码。我有一个 promise 对象和两个 console.log() 在 promise 对象的两侧。我以为它会打印

hi

There!

zami

但是打印出来了

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

最佳答案

总结:

Javascript 中的 promise 是一个对象,表示异步操作的最终完成或失败。 Promises 代表在未来某个时刻获得的值(value)。

一个 promise 可以有以下 3 个状态:

  1. Pending:这是 promise 的初始状态, promise 现在正在等待解决拒绝。例如,何时使用 AJAX 请求访问 Web 并将请求包装在 promise 中。那么在没有返回请求的时间窗口内,promise会处于pending状态。
  2. 已履行:当操作成功完成时, promise 就已履行。例如,当我们使用 AJAX 获取一些 JSON 数据并将其包装在一个 promise 中时。当我们成功取回数据时, promise 就实现了。
  3. 拒绝:当操作失败时,promise 被拒绝。例如,当我们使用 AJAX 获取一些 JSON 数据并将其包装在一个 promise 中时。当我们收到 404 错误时, promise 已被拒绝。

promise 构造函数:

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

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

兴趣点:

  • promise 构造函数中的代码是同步执行的。
  • then 方法将回调作为第一个参数,该回调在 promise 履行时异步执行。
  • then 方法将回调作为第二个参数,该回调在 promise 拒绝时异步执行。然而,我们通常为此使用 catch 方法(因为这更冗长),它还接受一个回调,该回调在 promise 拒绝时执行异步catch 本质上与 then(null, failCallback) 相同。
  • then 回调接收作为第一个参数的解析值(在本例中为字符串“success”)。
  • catch 回调接收作为第一个参数的拒绝值(在本例中为字符串“Error”)。
  • finally 方法接收回调,该回调在同时 promise 实现和拒绝时执行。在这里我们可以编写“清理”代码,无论 promise 结果如何都需要始终执行。

你的例子:

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

关于javascript - 理解 JavaScript promise 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39458201/

相关文章:

javascript - 可观察到的 : Chaining promises & firing events on each promise

javascript - Chrome 扩展程序不等待 DOM 加载

javascript - ES6 + SystemJs - 为什么我必须使用 .js 扩展名来导入 es6 模块?

javascript - 如何制作一个让浏览器在 Node 环境中安全加载的 javascript webpack 模块?

Javascript:创建看起来像默认函数的自定义函数

angularjs - for 循环中的递归 $http.get

javascript - 指令未以 Angular 显示

r - 惰性求值和 Promise 数据结构

for 循环中的 Promise

javascript - 返回内部的 promise 然后不起作用