本机承诺

Version >= V6.0.0

Promise 是异步编程的工具。在 JavaScript 中,承诺以其 then 方法而闻名。承诺有两个主要状态’待定’和’已结算’。一旦承诺已经解决,它就无法回到待定状态。这意味着承诺主要适用于仅发生一次的事件。 settled 状态有两个状态: resolvedrejected。你可以使用 new 关键字创建新的承诺,并将函数传递给构造函数 new Promise(function (resolve, reject) {})

传递给 Promise 构造函数的函数总是接收通常分别名为 resolvereject 的第一个和第二个参数。这两个参数的命名是惯例,但它们会将承诺置于已解决状态或已拒绝状态。当其中任何一个被称为承诺时,承诺从待定变为已结算。当执行所需的动作(通常是异步的)并且如果动作有错误时使用 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 的更多信息。