Javascript承诺和可选参数[重复]

tcbh2hod  于 2022-12-10  发布在  Java
关注(0)|答案(2)|浏览(134)

此问题在此处已有答案

Where do the promise callback arguments come from(3个答案)
When or who does pass resolve and reject functions to JS promises?(6个答案)
5小时前关门了。
我试图理解承诺和它们的可选参数。
(我假设因为参数是可选的,所以太少的参数是可以接受的,太多的参数也是可以接受的)。
例如:

let myPromise = new Promise(function(first, second, third) {
  let x = 0;
  if (x == 0) { //<<true
    second();
  } else {
    third();
  }
});

myPromise.then(
  function() {
    console.log("1");
  },
  function() {
    console.log("2");
  }
);

运行第二个函数并输出“2”。

let myPromise = new Promise(function(first, second, third) {
  let x = 0;
  if (x != 0) { //<<false
    second();
  } else {
    third();
  }
});

myPromise.then(
  function() {
    console.log("1");
  },
  function() {
    console.log("2");
  }
);

也运行第二个函数并输出“2”。
在第一种情况下,是Promise通过名称调用函数;在第二种情况下,通过位置调用函数?
Promise究竟如何知道要调用哪个函数?

gpfsuwkq

gpfsuwkq1#

参数的顺序很重要,因为传入值的顺序决定了它们被赋给哪些变量。
new Promise的回调函数有两个参数,一个是解析承诺的函数,另一个是拒绝承诺的函数,因为没有传递第三个参数,所以third就是undefined
then方法有两个参数。一个是解析承诺时调用的函数,另一个是拒绝承诺时调用的函数。
在第二个例子中,promise被拒绝了,这不是因为你调用了reject函数,而是因为你试图调用undefined,就好像它是一个引发异常的函数一样。

const promise = new Promise((resolve, reject, third) => {
  console.log(typeof resolve);
  console.log(typeof reject);
  console.log(typeof third);
  third();
});

promise.then(
    (value) => console.log("Resolved", value),
    (error) => console.log("Rejected", error.message)
);
hfyxw5xn

hfyxw5xn2#

构造函数回调的第一个参数是解析器函数--调用它,它将导致返回的Promise被实现。
第二个参数是一个函数,如果调用该函数,将导致Promise拒绝。
第三个(以及所有后续)参数是undefined。您可以在构建Promise时自由定义它们,但它们的值始终是undefined
在第一个代码段中,调用了第二个参数,拒绝了Promise。
在第二个程式码片段中,您呼叫第三个参数- *,但第三个参数不是函数 *。Promise建构函式内掷回的同步错误会导致Promise拒绝。请检查错误行程常式中的error.message,以取得更好的了解:

let myPromise = new Promise(function(first, second, third) {
  third();
});

myPromise.then(
  function() {
    console.log("1");
  },
  function(x) {
    console.log(x.message);
  }
);

因此,这并不是说你可以随意调用任何你想要的位置参数,引擎会神奇地理解你试图做什么--而是说,无论参数是什么,导致抛出错误的 * 任何 * 都会导致Promise被拒绝。

相关问题