此问题在此处已有答案:
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究竟如何知道要调用哪个函数?
2条答案
按热度按时间gpfsuwkq1#
参数的顺序很重要,因为传入值的顺序决定了它们被赋给哪些变量。
对
new Promise
的回调函数有两个参数,一个是解析承诺的函数,另一个是拒绝承诺的函数,因为没有传递第三个参数,所以third
就是undefined
。then
方法有两个参数。一个是解析承诺时调用的函数,另一个是拒绝承诺时调用的函数。在第二个例子中,promise被拒绝了,这不是因为你调用了reject函数,而是因为你试图调用
undefined
,就好像它是一个引发异常的函数一样。hfyxw5xn2#
构造函数回调的第一个参数是解析器函数--调用它,它将导致返回的Promise被实现。
第二个参数是一个函数,如果调用该函数,将导致Promise拒绝。
第三个(以及所有后续)参数是
undefined
。您可以在构建Promise时自由定义它们,但它们的值始终是undefined
。在第一个代码段中,调用了第二个参数,拒绝了Promise。
在第二个程式码片段中,您呼叫第三个参数- *,但第三个参数不是函数 *。Promise建构函式内掷回的同步错误会导致Promise拒绝。请检查错误行程常式中的
error.message
,以取得更好的了解:因此,这并不是说你可以随意调用任何你想要的位置参数,引擎会神奇地理解你试图做什么--而是说,无论参数是什么,导致抛出错误的 * 任何 * 都会导致Promise被拒绝。