Javascript:在承诺中,解析和拒绝的目的是什么?

Javascript:在承诺中,解析和拒绝的目的是什么?,javascript,promise,Javascript,Promise,据我所知,resolve和reject在提供给promise构造函数的回调中指定,并在回调中调用。但是,决心和拒绝(我认为)总是做同样的事情,那么为什么还要指定它们呢 编辑:我应该澄清:我不认为resolve和reject做同样的事情;我的意思是“解析”似乎总是“解析”,而“拒绝”总是“拒绝”——有没有一种方法可以传递函数而不是执行其他操作的“解析” 编辑:进一步澄清,正如我在下面的评论中所做的那样:如果承诺构造函数接受一个函数,而该函数又接受resolve和reject,并且这些函数总是在函数

据我所知,resolve和reject在提供给promise构造函数的回调中指定,并在回调中调用。但是,决心和拒绝(我认为)总是做同样的事情,那么为什么还要指定它们呢

编辑:我应该澄清:我不认为resolve和reject做同样的事情;我的意思是“解析”似乎总是“解析”,而“拒绝”总是“拒绝”——有没有一种方法可以传递函数而不是执行其他操作的“解析”

编辑:进一步澄清,正如我在下面的评论中所做的那样:如果承诺构造函数接受一个函数,而该函数又接受resolve和reject,并且这些函数总是在函数中被调用,那么为什么必须将resolve和reject指定为参数呢


最终编辑:我尝试使用foo而不是resolve,但仍然有效。这怎么可能?我根本没有定义foo??除了承诺之外,我可能还不了解javascript

我假设您指的是
then()
函数,它接受两次回调,一次是在承诺得到解决时,另一次是在承诺得到解决时。模式通常如下所示:

myPromise.then(result => {
        // do something here
    },
    error => {
    }
);
如果承诺得到解决,一切都按预期进行,第一次回调应正常进行。如果承诺被拒绝,第二个回调将执行错误处理,可能会向用户显示适当的消息。它们从来不会做同样的事情

如果您的逻辑应该总是出现,无论是否存在错误,您都应该将另一个调用链接到
then()

这在概念上与许多编程语言中的“try…catch…finally”相同。

解析和拒绝不“做同样的事情”

当你解决一个承诺时,你是在说“这是这个承诺的成功回应”

当你拒绝一个承诺时,你是在说“这个承诺失败是因为……”

例如:

在下面的示例中,想象一下
accountApiRequest()
实际执行API请求以获取帐户。如果没有帐户,它很可能返回
null
或抛出异常

当承诺成功时,您将
解决它。当承诺不成功时,它将被拒绝

成功的承诺
函数accountapirest(){
返回{
身份证号码:1234,
用户名:“吉姆”,
}
}
函数getAccount(){
返回新承诺(功能(解决、拒绝){
account=accountApiRequest()
如果(!帐户){
返回拒绝('无法获取帐户')
}
返回解析(帐户)
});
}

getAccount().then(console.log).catch(console.log)
在Promise构造函数中,我们有一个回调,它将
解析
拒绝
方法作为其参数。使用构造函数创建承诺后,承诺可以有三种状态:

  • 未决
  • 决心
  • 拒绝
  • 解析承诺后,将调用
    then()
    方法中传递的回调。如果承诺被拒绝,则调用
    catch()
    方法中传递的回调。例如:

    const prom=新承诺((解决、拒绝)=>{
    设置超时(()=>{
    if(Math.random()>0.5){
    解决(“已解决”);
    }否则{
    拒绝(“拒绝”);
    }
    }
    , 2000)
    });
    prom.then((val)=>console.log('success:'+val))
    
    .catch((val)=>console.log('fail:'+val))
    当我读到关于承诺的文章时,我也有同样的问题。我逐渐了解到,您不需要自己定义resolve和reject函数(它们将被忽略,并且无论如何都将调用标准resolve/reject函数):我将它们视为特殊函数,它允许您通过调用其中一个函数来指示是解析还是拒绝承诺;以及在每种情况下通过向这些函数传递参数返回什么值。在promise构造函数中如何命名并不重要——第一个参数是resolve function,第二个参数是reject。

    当您创建JS promise时,您希望某些任务异步发生。这项任务可能成功,也可能失败。成功和失败是根据任务的内容来定义的

    创建新承诺时,作为创建者,您必须指定任务成功或失败时要做什么。要向承诺的消费者传达同样的信息,解决/拒绝就变得方便了

    因此,当消费者使用
    时,则
    检查承诺的输出。resolve返回的内容将提供给消费者

    import {Promise} from 'es6-promise'
    
    
    const foo = true;
    const fcuk = new Promise((resolve, reject) => {
        if (foo) {
            resolve(4);
        } else {
            reject(2);
        }
    })
    fcuk.then((value) => console.log(value)).catch((value) => console.log(value));
    
    当消费者使用
    捕获检查承诺的输出时。拒绝返回的任何内容都将提供给消费者

    import {Promise} from 'es6-promise'
    
    
    const foo = true;
    const fcuk = new Promise((resolve, reject) => {
        if (foo) {
            resolve(4);
        } else {
            reject(2);
        }
    })
    fcuk.then((value) => console.log(value)).catch((value) => console.log(value));
    

    您可以通过将foo的值更改为true/false来运行上面的示例,并亲自查看输出是什么。

    它们的作用不同。你是怎么想到的?你说的“总是做同样的事情”是什么意思?你认为他们是干什么的?如果没有
    resolve
    可用,您将如何解析承诺?如果您没有指定它们,当承诺完成或出现错误时,您将如何调用它们?
    reject(…)
    可以替换为
    resolve(Promise.reject(…)
    ,当然,但它们不会执行相同的操作?即使你只需要一个-为什么你认为不需要指定一个?通过“指定”,你的意思是“声明为参数”?如果不是“承诺((解决,拒绝)=>…”我们可以说“承诺((foo,bar)=>…”定义foo和bar函数?如果不是,如果必须始终使用resolve和reject,并且它们始终具有相同的功能,那么为什么必须指定它们?名称不相关,可以使用Promise((foo,bar)=>…如您所说。在承诺构造函数中,这些函数只是在承诺构造函数中传递的函数作为参数公开的函数