无法完全理解 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);