{//这个回调函数将在任务完成后被调用,返回最终的`error`或`result`。//任何" />

Promise() 构造函数

您所在的位置:网站首页 ipromise的中文是什么 Promise() 构造函数

Promise() 构造函数

2024-05-19 00:36| 来源: 网络整理| 查看: 265

传统上(在 Promise 出现之前),设计上异步任务基于回调函数实现。

jsreadFile("./data.txt", (error, result) => { // 这个回调函数将在任务完成后被调用,返回最终的 `error` 或 `result`。 // 任何依赖于返回结果的操作都必须在这个回调函数内定义。 }); // `readFile` 请求被发出后,此处的代码会立即执行。 // 它不会等待回调函数被调用,因此使 `readFile` 成为了“异步”的。

为了利用 Promise 提供的更好的可读性和语言特性,Promise() 构造函数允许将基于回调的 API 转换为基于 Promise 的 API。

备注: 如果你的任务已经基于 Promise 实现,你大概率不需要使用 Promise() 构造函数。

executor 是将回调函数的结果与 Promise 关联在一起的自定义代码。编写 executor 的工作由程序员完成。它的函数签名应该是:

jsfunction executor(resolveFunc, rejectFunc) { // 通常,`executor` 函数用于封装某些接受回调函数作为参数的异步操作,比如上面的 `readFile` 函数 }

resolveFunc 和 rejectFunc 也是函数,你可以给它们任何实际的名称。它们的函数签名很简单:它们接受一个任意类型的参数。

jsresolveFunc(value); // 解决时调用 rejectFunc(reason); // 拒绝时调用

传入 resolveFunc 的 value 参数可以是另一个 Promise 对象,在这种情况下,新构造的 Promise 对象的状态将“锁定”到传入的 Promise 对象(作为 resolution Promise 的一部分)。rejectFunc 的语义类似于 throw 语句,因此 reason 通常是一个 Error 实例。如果 value 或 reason 中有任意一个被省略,Promise 将会被兑现(fulfilled)或拒绝(rejected)为 undefined。

executor 的完成状态对 Promise 的状态影响有限:

executor 函数的返回值会被忽略。executor 函数中的 return 语句仅影响控制流程,调整函数某个部分是否执行,但不会影响 Promise 的兑现值。如果 executor 函数退出,且未来不可能调用 resolveFunc 或 rejectFunc(例如,没有安排异步任务),那么 Promise 将永远保持待定状态。 如果在 executor 函数中抛出错误,则 Promise 将被拒绝,除非 resolveFunc 或 rejectFunc 已经被调用。

备注: 待定的 Promise 的存在并不会阻止程序退出。如果事件循环为空,则程序会退出,尽管存在待定的 Promise(因为它们必然永远处于待定状态)。

以下是典型的 Promise 流程概述:

在构造函数生成新的 Promise 对象时,它还会生成一对相应的 resolveFunc 和 rejectFunc 函数;它们与 Promise 对象“绑定”在一起。 executor 通常会封装某些提供基于回调的 API 的异步操作。回调函数(传给原始回调 API 的函数)在 executor 代码中定义,因此它可以访问 resolveFunc 和 rejectFunc。 executor 是同步调用的(在构造 Promise 时立即调用),并将 resolveFunc 和 rejectFunc 函数作为传入参数。 executor 中的代码有机会执行某些操作。异步任务的最终完成通过 resolveFunc 或 rejectFunc 引起的副作用与 Promise 实例进行通信。这个副作用让 Promise 对象变为“已解决”状态。 如果先调用 resolveFunc,则传入的值将解决。Promise 可能会保持待定状态(如果传入了另一个 thenable 对象),变为已兑现状态(在传入非 thenable 值的大多数情况下),或者变为已拒绝状态(在解析值无效的情况下)。 如果先调用 rejectFunc,则 Promise 立即变为已拒绝状态。 一旦 resolveFunc 或 rejectFunc 中的一个被调用,Promise 将保持解决状态。只有第一次调用 resolveFunc 或 rejectFunc 会影响 Promise 的最终状态,随后对任一函数的调用都不能更改兑现值或拒绝原因,也不能将其最终状态从“已兑现”转换为“已拒绝”或相反。 如果 executor 抛出错误,则 Promise 被拒绝。但是,如果 resolveFunc 或 rejectFunc 中的一个已经被调用(因此 Promise 已经被解决),则忽略该错误。 解决 Promise 不一定会导致 Promise 变为已兑现或已拒绝(即已敲定)。Promise 可能仍处于待定状态,因为它可能是用另一个 thenable 对象解决的,但它的最终状态将与已解决的 thenable 对象一致。 一旦 Promise 敲定,它会(异步地)调用任何通过 then()、catch() 或 finally() 关联的进一步处理程序。最终的兑现值或拒绝原因在调用时作为输入参数传给兑现和拒绝处理程序(请参阅 promise 的链式调用)。

例如,上面的基于回调的 readFile API 可以转换为基于 Promise 的 API。

jsconst readFilePromise = (path) => new Promise((resolve, reject) => { readFile(path, (error, result) => { if (error) { reject(error); } else { resolve(result); } }); }); readFilePromise("./data.txt") .then((result) => console.log(result)) .catch((error) => console.error("读取文件失败"));

resolve 和 reject 回调仅在 executor 函数的作用域内可用,这意味着在构造 promise 之后无法访问它们。如果你想在决定如何解决之前先构造 promise,可以使用 Promise.withResolvers() 方法,该方法暴露了 resolve and reject 函数。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3