繁体   English   中英

为什么解析参数首先出现在 JavaScript Promises 中?

[英]Why resolve parameter comes first in JavaScript Promises?

我正在学习 javascript Promises。 在我看来,JavaScript Promise工作方式类似于callback函数。

callback函数中,我们通常使用第一个参数作为error第二个作为success

那么为什么在 JavaScript Promise ,参数的出现方式不同呢? 首先是success ,其次是error 这就像callback参数结构的相反,它让我感到困惑。

这不是问题,但我想对此做出解释。 如果我错了,那我错过了什么?

您显然是在谈论 Promise 执行器函数(您传递给new Promise(...) )。 这只是一种完全不同类型的回调,它与标准的 node.js 异步回调实际上没有任何共同之处。

promise executor 函数向您传递了两个独立的函数,您可以稍后调用它们。 两者都不是错误。 当您确实遇到错误时,您会调用reject(err)并将错误作为第一个参数传递给它。

传递两件事的另一个地方是.then()处理程序,您可以在其中传递解析处理程序和拒绝处理程序。 同样,这是完全不同的事情。 您正在向它传递两个函数引用,promise 基础结构将决定传递哪个回调。 当它调用这些回调时,它会将参数作为第一个参数传递。

以下是 Promise 中两个不同的回调元素:

// promise executor function
let p = new Promise((resolve, reject) => {
    // this is passing to your callback two function references.
    // there's no error at this point.
    // you decide which function to call in your asynchronous operation
});

// then handler
somePromise.then(resolveData => {
    // this callback gets called when your promise resolves
    // it is known there is no error here, so no need to pass an err parameter
}, rejectErr => {
    // this callback gets called when your promise is rejected
    // the error is passed as the first argument
    // this callback is optional
});

还有.catch().finally()处理程序,但它们的工作方式与单个回调类似。

请记住,该模式:

 p.then(successHandler, errorHandler)

没有将错误作为第二个参数传递给您。 您正在向它传递两个函数引用,稍后它将调用其中一个。 通过这种方式,它不像fs.readFile()会使用的标准 nodejs 异步回调。 它有一个完全不同的目的和不同的工作方式。

您将 JavaScript 承诺回调与来自 Node 标准库 API 的回调设计模式混淆了。 她们不一样。

JavaScript promises 的目的是处理长时间运行的进程,我们需要一些能力来确定进程何时完成以继续运行下一段代码。

因此,在您正在了解的 Promises 回调中,有 3 种状态: unresolvedresolutiondenied

默认情况下,Promise 存在于未解析状态,这意味着您刚刚创建了 Promise 并且您正在等待某些事情发生,一些长时间运行的进程(例如 Ajax 请求或其他事件)发生,一旦发生,Promises 进入进入其他两个状态之一,解决拒绝

以上不是 Node 标准库回调的目的和功能,它们在作为文件系统 API 一部分的函数内部使用。 这些特定的函数,例如read()readdir()等,有三个可以传递给它的参数,一个是可选的,第三个是您所说的回调。

使用文件系统函数时,Node 标准库回调的模式是在该回调参数中提供两个参数,第一个始终是错误对象err ,现在不能保证会发生错误,而是如果出现问题当打开一些文件时,Node 将使用err对象的第一个参数调用回调。

如果没有错误,则第一个参数将为空。

现在回调函数的第二个参数将是我实际要查找的数据。

https://nodejs.org/api/fs.html#fs_file_system

你看,你在谈论两种不同的回调。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM