Promise((resolve,reject)=> {})和Promise(resolve => {})有什么区别?

时间:2018-08-13 16:34:23

标签: javascript es6-promise

我们知道Promise构造函数采用一个执行程序函数,该函数具有两个参数,可用于生成成功案例或失败案例。今天,我正在编程并且陷入困境,但是后来我解决了这个问题,但是发现了一件事需要理解。

两者之间有什么区别

new Promise(resolve => {

    // resolve

});

new Promise((resolve,reject)=>{

    // resolve
    // reject

});

我们可以这样吗?

new Promise(resolve => {

    // resolve

}, reject => {

    // reject

});

示例将更加受赞赏。谢谢!!!

4 个答案:

答案 0 :(得分:4)

这不仅仅针对Promises,而只是回调函数。

new Promise((resolve) => {}); 1 创建一个Promise,其回调仅采用resolve参数。 2

无法调用否则会提供的拒绝功能。

new Promise((resolve, reject) => {});创建一个Promise,其回调使用两个参数,包括用于拒绝的参数。

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

new Promise((reject, resolve) => {});将创建一个Promise,您可以在其中使用reject进行解决,而在resolve中进行拒绝。

您可以在回调函数的范围内throwresolve(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 argumentarguments[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.resolvePromise.reject

显式地返回另一个承诺。

最后,最后一个带有多个回调作为Promise构造函数的参数的函数将无法正常工作,因为这样设计的目的就像是一个带有2个参数的回调。