当前位置: 首页 > 知识库问答 >
问题:

无法完全理解Javascript中的Promises

周和歌
2023-03-14

所以我主要了解如何正确编写ES6风格的promise以及如何使其工作。但是现在我试图理解幕后的一切是如何运作的。

我已经研究了好几个小时,找不到任何能完全回答我问题的东西(至少用我能理解的足够简单的术语)。对我来说,最令人困惑的部分之一是.reslove().reject()回调,它们是传递给Promise构造函数的匿名函数的参数。

正如您在下面的代码中看到的,在我的条件语句中调用了解决()拒绝()函数,这取决于let bool是真还是假。

如何调用匿名函数内部的解析和拒绝函数?

谁叫决心和拒绝?在普通回调中,有一个函数名被传递到另一个函数参数中,该参数允许您在主函数中通过其参数名调用传递的函数。但是,传递到匿名函数中的是什么呢?该匿名函数传递到为resolve和reject参数命名的Promise构造函数中的是什么?

根据传递或失败条件,似乎传递到解析和拒绝的字符串被传递到然后或捕获,但是Javascript如何知道将解析链接到然后并拒绝捕获呢?然后,如何传递字符串'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的逻辑感到沮丧和困惑。

共有3个答案

傅毅然
2023-03-14

下面是一个(极其)简化的例子。

class P{
  constructor(callback){
    callback(v=>this.resvalue=v, v=>this.rejvalue=v)
  }
}

let p = new P((resolve,reject)=>{
  resolve(1);
})

console.log(p)
阎宝
2023-03-14

你有没有去过披萨店,在那里你点了披萨,然后你没有马上拿到披萨,但是你有一个蜂鸣器设备,当你的披萨准备好了,它会警告你?这正是Promise的含义。

传递给Promise的构造函数的函数是准备比萨饼的厨师。cook接受两个参数,它们是函数。厨师吃完比萨饼后,将调用resolve函数。如果出现问题,比萨饼无法完成,它将调用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);
蓟安歌
2023-03-14

你可以阅读更多关于https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/Promise

也可以在任何现代IDE中随意检查Promise类。

TLDR;总之,Promise有一个内部执行器,它将您的“传递”值与p.then处理程序挂钩,但在您调用拒绝(“失败”)时抛出一个由。

 类似资料:
  • 本文向大家介绍理解javascript中的Function.prototype.bind的方法,包括了理解javascript中的Function.prototype.bind的方法的使用技巧和注意事项,需要的朋友参考一下 在初学Javascript时,我们也许不需要担心函数绑定的问题,但是当我们需要在另一个函数中保持上下文对象this时,就会遇到相应的问题了,我见过很多人处理这种问题都是先将th

  • 我通过点击此链接安装了Postgres,但现在无法完全删除它。 http://www.thegeekstuff.com/2009/04/linux-postgresql-install-and-configure-from-source/ 运行时:Sudo apt-get-purge remove postgres或Sudo apt-get - purge remove psql得到以下响应 软件

  • 我在以前的一些应用程序中一直使用HtmlUnit(开发人员做得很好)作为无头浏览器,但javascript支持对于我的下一个应用程序将访问的某些网站不起作用。 > 我听说了用于Python的QtWebKit绑定,但我的应用程序将使用Java,或者是否有用于WebKit或QtWebKit的Java绑定? 有人知道一个好的无头Java浏览器,它完全支持javascript吗?

  • 本文向大家介绍Java中的Calendar日历API用法完全解析,包括了Java中的Calendar日历API用法完全解析的使用技巧和注意事项,需要的朋友参考一下 第一部分 Calendar介绍 Calendar 定义: Calendar 可以看作是一个抽象类。 它的实现,采用了设计模式中的工厂方法。表现在:当我们获取Calendar实例时,Calendar会根据传入的参数来返回相应的Calend

  • 本文向大家介绍AngularJS中的过滤器filter用法完全解析,包括了AngularJS中的过滤器filter用法完全解析的使用技巧和注意事项,需要的朋友参考一下 在AngularJS的世界里,filter提供了一种格式化数据的方法,Angular也提供给我们了很多内建的过滤器,并且建立自定义过滤器也是相当的简单 在HTML的模板绑定{{}}中,我们使用 | 来调用过滤器,比如,我们想让字符串

  • 本文向大家介绍理解javascript async的用法,包括了理解javascript async的用法的使用技巧和注意事项,需要的朋友参考一下 写在前面 本文将要实现一个顺序读取文件的最优方法,实现方式从最古老的回调方式到目前的async,也会与大家分享下本人对于thunk库与co库的理解。实现的效果:顺序读取出a.txt与b.txt,将读出的内容拼接成为一个字符串。 同步读取 这种方式最利于