无法完全理解 Javascript 中的 Promises
Having trouble fully understanding Promises in Javascript
所以我基本上了解如何正确编写 ES6 风格的承诺以及如何使其发挥作用。但现在我正试图了解幕后的一切是如何运作的。
我研究了好几个小时,但找不到任何能完全回答我的问题的东西(至少用足够简单的术语让我理解)。对我来说最令人困惑的部分之一是 .reslove()
和 .reject()
回调,它们是传递给 Promise 构造函数的匿名函数的参数。
正如您在我下面的代码中看到的那样,在我的条件语句中调用 resolve()
和 reject()
函数取决于 let bool 是真还是假。
如何在匿名函数中调用 resolve 和 reject 函数?
谁叫 resolve 和 reject?在一个普通的回调中,你有一个函数名被传递给另一个函数参数,允许你通过它的参数名在主函数中调用传递的函数。但是,传递给匿名函数的是什么,传递给 Promise 构造函数的匿名函数为 resolve 和 reject 参数名称提供了任何功能?
似乎传递给 resolve 和 reject 的字符串根据通过或失败条件传递给 then 或 catch,但是 Javascript 如何知道 link resolve 到 then 和 reject 到 catch?以及 then 和 catch 如何将字符串 'Pass'
或 'Fail'
传递给它们内部的匿名函数,从而允许将字符串打印到控制台?
var p = new Promise(function(resolve, reject) {
let bool = false;
if (bool) {
resolve('Pass');
} else {
reject('Fail');
}
});
p.then(function(val) {
console.log(val);
}).catch(function(val) {
console.log(val);
});
抱歉,如果这是一团糟。但是我对构成 Promise 的逻辑感到非常沮丧和困惑。
您可以在 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/Promise
上阅读更多内容
也可以在任何现代 IDE.
中随意检查 Promise class
TLDR;总而言之,Promise 有一个内部执行程序,它将您的 'Pass' 值与 p.then 处理程序挂钩,但会在您调用 reject('Fail') 时抛出由 .catch 捕获的异常.
这是一个(极其)简化的示例。
class P{
constructor(callback){
callback(v=>this.resvalue=v, v=>this.rejvalue=v)
}
}
let p = new P((resolve,reject)=>{
resolve(1);
})
console.log(p)
您是否去过一家比萨饼店,您在那里点了比萨饼,但您没有立即拿到比萨饼,但您有一个蜂鸣器装置,当您的比萨饼准备好时会发出警告?这正是 Promise
的含义。
您传递给 Promise
的构造函数的函数是准备披萨的厨师。厨师有两个参数,它们是函数。当厨师吃完披萨后,它会调用 resolve
函数。如果出现问题导致披萨吃不完,它会调用reject
函数。
Who calls resolve and reject?
您传递给 Promise
(厨师)的构造函数的函数。它就在您的代码中:
if (bool) {
resolve('Pass'); // Call the resolve function
} else {
reject('Fail'); // Call the reject function
}
您通过在 Promise
对象上调用 then(...)
和 catch(...)
来提供要调用的实际函数。
p.then(function(val) { // <= This function is the actual resolve function
console.log(val);
}).catch(function(val) { // <= This function is the actual reject function
console.log(val);
});
与使用抽象概念相比,使用具体示例(如厨师和披萨)可能更容易理解:
function pizzaCook(resolve, reject) {
let bool = false;
if (bool) {
resolve('Pizza is ready!');
} else {
reject('Sorry, the oven is broken!');
}
}
var p = new Promise(pizzaCook);
function letsEat(msg) {
console.log('Great, I can eat now, the cook said: ' + msg);
}
function stayHungry(msg) {
console.log('Oh no, I will stay hungry, because: ' + msg);
}
p.then(letsEat).catch(stayHungry);
所以我基本上了解如何正确编写 ES6 风格的承诺以及如何使其发挥作用。但现在我正试图了解幕后的一切是如何运作的。
我研究了好几个小时,但找不到任何能完全回答我的问题的东西(至少用足够简单的术语让我理解)。对我来说最令人困惑的部分之一是 .reslove()
和 .reject()
回调,它们是传递给 Promise 构造函数的匿名函数的参数。
正如您在我下面的代码中看到的那样,在我的条件语句中调用 resolve()
和 reject()
函数取决于 let bool 是真还是假。
如何在匿名函数中调用 resolve 和 reject 函数?
谁叫 resolve 和 reject?在一个普通的回调中,你有一个函数名被传递给另一个函数参数,允许你通过它的参数名在主函数中调用传递的函数。但是,传递给匿名函数的是什么,传递给 Promise 构造函数的匿名函数为 resolve 和 reject 参数名称提供了任何功能?
似乎传递给 resolve 和 reject 的字符串根据通过或失败条件传递给 then 或 catch,但是 Javascript 如何知道 link resolve 到 then 和 reject 到 catch?以及 then 和 catch 如何将字符串 'Pass'
或 'Fail'
传递给它们内部的匿名函数,从而允许将字符串打印到控制台?
var p = new Promise(function(resolve, reject) {
let bool = false;
if (bool) {
resolve('Pass');
} else {
reject('Fail');
}
});
p.then(function(val) {
console.log(val);
}).catch(function(val) {
console.log(val);
});
抱歉,如果这是一团糟。但是我对构成 Promise 的逻辑感到非常沮丧和困惑。
您可以在 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/Promise
上阅读更多内容也可以在任何现代 IDE.
中随意检查 Promise classTLDR;总而言之,Promise 有一个内部执行程序,它将您的 'Pass' 值与 p.then 处理程序挂钩,但会在您调用 reject('Fail') 时抛出由 .catch 捕获的异常.
这是一个(极其)简化的示例。
class P{
constructor(callback){
callback(v=>this.resvalue=v, v=>this.rejvalue=v)
}
}
let p = new P((resolve,reject)=>{
resolve(1);
})
console.log(p)
您是否去过一家比萨饼店,您在那里点了比萨饼,但您没有立即拿到比萨饼,但您有一个蜂鸣器装置,当您的比萨饼准备好时会发出警告?这正是 Promise
的含义。
您传递给 Promise
的构造函数的函数是准备披萨的厨师。厨师有两个参数,它们是函数。当厨师吃完披萨后,它会调用 resolve
函数。如果出现问题导致披萨吃不完,它会调用reject
函数。
Who calls resolve and reject?
您传递给 Promise
(厨师)的构造函数的函数。它就在您的代码中:
if (bool) {
resolve('Pass'); // Call the resolve function
} else {
reject('Fail'); // Call the reject function
}
您通过在 Promise
对象上调用 then(...)
和 catch(...)
来提供要调用的实际函数。
p.then(function(val) { // <= This function is the actual resolve function
console.log(val);
}).catch(function(val) { // <= This function is the actual reject function
console.log(val);
});
与使用抽象概念相比,使用具体示例(如厨师和披萨)可能更容易理解:
function pizzaCook(resolve, reject) {
let bool = false;
if (bool) {
resolve('Pizza is ready!');
} else {
reject('Sorry, the oven is broken!');
}
}
var p = new Promise(pizzaCook);
function letsEat(msg) {
console.log('Great, I can eat now, the cook said: ' + msg);
}
function stayHungry(msg) {
console.log('Oh no, I will stay hungry, because: ' + msg);
}
p.then(letsEat).catch(stayHungry);