Javascript 承诺((resolve,reject)=>;{})和承诺(resolve=>;{})之间有什么区别?

Javascript 承诺((resolve,reject)=>;{})和承诺(resolve=>;{})之间有什么区别?,javascript,es6-promise,Javascript,Es6 Promise,正如我们所知,Promise构造函数接受一个执行器函数,该函数有两个参数,用于生成成功案例或失败案例。今天我正在编程,我被卡住了,但后来我解决了这个问题,但我发现有一件事需要理解 两者的区别是什么 new Promise(resolve => { // resolve }); 及 我们可以这样做吗 new Promise(resolve => { // resolve }, reject => { // reject }); 请举例说明。

正如我们所知,Promise构造函数接受一个执行器函数,该函数有两个参数,用于生成成功案例或失败案例。今天我正在编程,我被卡住了,但后来我解决了这个问题,但我发现有一件事需要理解

两者的区别是什么

new Promise(resolve => {

    // resolve

});

我们可以这样做吗

new Promise(resolve => {

    // resolve

}, reject => {

    // reject

});

请举例说明。谢谢

如果您知道承诺永远不会失败,例如计时器,则可以省略
拒绝
。任何需要错误处理程序(http请求、文件i/o等)的操作都需要
拒绝
回调。

传递的箭头函数是异步操作结束时触发的回调。 它接受两个参数,成功时调用的函数(resolve)和失败时调用的函数(reject)

在JS中,您不必将所有参数传递给函数回调。如果您不打算处理错误(您应该处理!),您可以忽略它


如果您传递1个参数,则它被视为解析fn。

这不是特定于承诺的,只是针对回调函数

新承诺((解析)=>{})
1创建一个承诺,其回调仅接受
resolve
参数。无法调用否则将提供的拒绝函数。2

新承诺((解决、拒绝)=>{})创建一个承诺,其回调同时接受两个参数,包括用于拒绝的参数

以上两个示例演示了位置参数的工作原理。回调函数中的第一个参数始终是resolve函数,第二个参数始终是reject函数

新承诺((拒绝,解决)=>{})
将创建一个承诺,在该承诺中,您可以使用
拒绝
进行解决,也可以使用
解决
进行拒绝

您可以
在回调函数的作用域中抛出
,或
解析(Promise.reject())
导致拒绝发生:

new Promise((resolve) => {
  throw new Error("42");
  // or `resolve(Promise.reject(new Error("42")));`
})
  .catch(console.warn); // Prints warning “Error: "42"” in the console.
您不能使用
新承诺((解析)=>{},(拒绝)=>{})
,因为
承诺
构造函数只接受一个参数。第二个回调函数将被忽略


1
(resolve)=>{}
当然等同于
resolve=>{}
。但箭头函数参数实际上总是需要括号。简单和单一参数是唯一可以忽略的例外。看


2:使用常规函数,
新承诺(函数(解析){})
新承诺(函数(){}) >可以使用<代码>参数(0)<代码>(解析)或<代码>参数(1)< /代码>(拒绝).< /p> < p> >忘记承诺,如果一个函数有一个参数被调用为两个参数,则不存在任何问题,如PAR JavaScript标准(反之亦然)。
现在,与您的承诺相关,您传递给构造函数的回调将由两个参数(解析器函数和拒绝器)调用。如果您创建的函数有1个参数,并将其传递给Promise的构造函数,那么它将被2个参数调用,因为您没有对第二个参数的引用,所以您不能以假定为用户的方式使用它(作为泛型语句,而不是Promise)

如果仍然需要第二个参数,您仍然可以尝试使用
参数
,但是,使用
arrow
函数,您将无法获得第二个参数。在这种情况下,最好使用普通的
函数(){}
。否则,您可以尝试使用
promise.resolve
promise.reject显式返回另一个承诺


最后一个带有多个回调作为参数的Promise构造函数肯定不起作用,因为它的设计就像一个带有2个参数的回调一样。

我们可以这样做吗?
不。@jonaswillms-现在有一件事很清楚了。谢谢:)您不能将解析和拒绝操作分开,这两个操作应该在同一上下文中使用,(resolve,reject)是回调变量,并且应该在同一个函数中使用,以便执行这些回调。Ok可能重复,因此如果我们传递一个函数,那么它将被视为承诺构造函数中的解析函数?是,传递到
Promise
构造函数的函数的第一个参数是resolve处理程序。第二个参数(拒绝处理程序)是可选的。如果我喜欢这个新承诺(resolve,reject=>{}),该怎么办。这是正确的吗?您需要在
resolve,reject
周围加一些括号,但在其他方面很好(当然,假设您将在
{}
之间加一些代码)。所以:
newpromise((resolve,reject)=>{resolve(getSomeValue());})
这意味着当我们做类似abc=>{}的事情时,它意味着abc是函数参数。如果我们需要多个参数,我们必须这样做(abc,def,…)=>{}。因此,在一个参数的情况下,可以省略括号,但在多个参数的情况下,需要括号。对吗?1b)有人
在回调中抛出
,或者
解析(Promise.reject())
如果我喜欢这个新的承诺(resolve,reject=>{}),该怎么办。是否正确?@DhuBytes如果有多个参数,则必须用(and)包装两个分开的参数,例如(resolve,reject)=>{}@DhuBytes No。箭头函数参数始终需要用括号包装,除非只有一个参数
new Promise(resolve,reject=>{})
是一个承诺,它将现有变量
resolve
作为执行器,并将忽略函数
(reject)=>{}
。因此,这意味着当我们执行类似于abc=>{}的操作时,它意味着abc是函数参数。如果我们需要多个参数,我们必须这样做(abc,def,…)=>{}。所以如果
new Promise((resolve) => {
  throw new Error("42");
  // or `resolve(Promise.reject(new Error("42")));`
})
  .catch(console.warn); // Prints warning “Error: "42"” in the console.