我正在努力思考 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 个状态:
- Pending:这是 promise 的初始状态, promise 现在正在等待解决或拒绝。例如,何时使用 AJAX 请求访问 Web 并将请求包装在 promise 中。那么在没有返回请求的时间窗口内,promise会处于pending状态。
- 已履行:当操作成功完成时, promise 就已履行。例如,当我们使用 AJAX 获取一些 JSON 数据并将其包装在一个 promise 中时。当我们成功取回数据时, promise 就实现了。
- 拒绝:当操作失败时,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/