为什么 resolve 参数在 JavaScript Promises 中排在第一位?

Why resolve parameter comes first in JavaScript Promises?

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

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

那为什么在JavaScriptPromise中参数来的不一样呢?第一个是 success,第二个是 error?这就像 callback 参数结构的反面,让我感到困惑。

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

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

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

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

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 回调中,有 3 种状态:未解决已解决拒绝.

默认情况下,Promise 处于未解决状态,这意味着您刚刚做出 Promise 并且您正在等待某些事情发生,一些漫长的 运行 过程,例如 Ajax 请求或其他一些事件发生,一旦发生,Promise 就会进入其他两种状态之一,resolvedrejected.

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

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

如果没有错误,那么第一个参数将改为 null。

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

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

你看,你说的是两个不同的回调。