![](/img/trans.png)
[英]Javascript resolve first element in array of promises that has been fullfilled in order
[英]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 种状态: unresolved 、 resolution和denied 。
默认情况下,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.