本机承诺
Version >= V6.0.0
Promise 是异步编程的工具。在 JavaScript 中,承诺以其 then
方法而闻名。承诺有两个主要状态’待定’和’已结算’。一旦承诺已经解决,它就无法回到待定状态。这意味着承诺主要适用于仅发生一次的事件。 settled
状态有两个状态: resolved
和 rejected
。你可以使用 new
关键字创建新的承诺,并将函数传递给构造函数 new Promise(function (resolve, reject) {})
。
传递给 Promise 构造函数的函数总是接收通常分别名为 resolve
和 reject
的第一个和第二个参数。这两个参数的命名是惯例,但它们会将承诺置于已解决状态或已拒绝状态。当其中任何一个被称为承诺时,承诺从待定变为已结算。当执行所需的动作(通常是异步的)并且如果动作有错误时使用 reject
,则调用 resolve
。
在下面,timeout 是一个返回 Promise 的函数。
function timeout (ms) {
return new Promise(function (resolve, reject) {
setTimeout(function () {
resolve("It was resolved!");
}, ms)
});
}
timeout(1000).then(function (dataFromPromise) {
// logs "It was resolved!"
console.log(dataFromPromise);
})
console.log("waiting...");
控制台输出
waiting...
// << pauses for one second>>
It was resolved!
调用超时时,传递给 Promise 构造函数的函数将立即执行。然后执行 setTimeout 方法,并将其回调设置为在下一个 ms
毫秒内触发,在本例中为 ms=1000
。由于未触发对 setTimeout 的回调,因此超时函数将控制权返回给调用范围。然后存储 then
方法链,以便在/如果 Promise 已解决时稍后调用。如果这里有 catch
方法,它们也会被存储,但是当/如果承诺’拒绝’时会被触发。
然后脚本打印’等待……’。一秒钟之后,setTimeout 调用它的回调,该回调使用字符串“It was resolved!”调用 resolve 函数。然后将该字符串传递给 then
方法的回调,然后记录给用户。
在同样的意义上,你可以包装异步 setTimeout 函数,该函数需要回调,你可以使用 promise 包装任何单个异步操作。
阅读 JavaScript 文档 Promises 中有关 promises 的更多信息。