我们知道Promise构造函数采用一个执行程序函数,该函数具有两个参数,可用于生成成功案例或失败案例。今天,我正在编程并且陷入困境,但是后来我解决了这个问题,但是发现了一件事需要理解。
两者之间有什么区别
new Promise(resolve => {
// resolve
});
和
new Promise((resolve,reject)=>{
// resolve
// reject
});
我们可以这样吗?
new Promise(resolve => {
// resolve
}, reject => {
// reject
});
示例将更加受赞赏。谢谢!!!
答案 0 :(得分:4)
这不仅仅针对Promises,而只是回调函数。
new Promise((resolve) => {});
1 创建一个Promise,其回调仅采用resolve
参数。 2
new Promise((resolve, reject) => {});
创建一个Promise,其回调使用两个参数,包括用于拒绝的参数。
以上两个示例演示了位置参数的工作原理。回调函数中的第一个参数始终是resolve函数,第二个始终是拒绝函数。
new Promise((reject, resolve) => {});
将创建一个Promise,您可以在其中使用reject
进行解决,而在resolve
中进行拒绝。
您可以在回调函数的范围内throw
或resolve(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.
您不能使用new Promise((resolve) => {}, (reject) => {});
,因为Promise
构造函数仅接受一个参数。第二个回调函数将被忽略。
1 :(resolve) => {}
当然等于resolve => {}
。但是箭头功能参数实际上总是需要括号。简单参数和单个参数是唯一的例外,可以将其省略。参见MDN article about arrow function syntax。
2 :使用常规功能new Promise(function(resolve){});
或new Promise(function(){});
,您可以将access any argument与arguments[0]
(解决 )或arguments[1]
(拒绝)。
答案 1 :(得分:2)
如果您知道诺言永不失败的事实(例如计时器),则可以省略reject
。任何需要错误处理程序(http请求,文件i / o等)的内容都将需要reject
回调。
答案 2 :(得分:0)
您传递的箭头函数是异步操作结束时触发的回调。 它接受2个参数,成功时调用的函数,(resolve),失败时调用的函数(拒绝)。
在JS中,您不必将所有参数都传递给函数回调。如果您不打算处理错误(应该处理!),则可以忽略它。
如果您传递1个参数,则将其视为解析fn。
答案 3 :(得分:0)
好吧,忘记诺言,如果任何具有一个参数的函数都被两个参数调用,那么按照标准JavaScript的标准就没有问题(反之亦然)。
现在,与您的诺言有关,传递给构造函数的回调将由2个参数(解析器函数和拒绝器)调用。如果您创建具有1个参数的函数并将其传递给Promise的构造函数,则简单地它将被2个参数调用,因为您没有引用第二个参数,因此不能以假定为用户的方式使用该参数(作为一般性声明)而不是为了保证)。
如果仍然需要第二个参数,您仍然可以尝试使用arguments
,但是使用arrow
函数也不会。在这种情况下,最好使用普通的function () {}
。否则,您可以尝试使用Promise.resolve
或Promise.reject
最后,最后一个带有多个回调作为Promise构造函数的参数的函数将无法正常工作,因为这样设计的目的就像是一个带有2个参数的回调。