Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/427.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么在Promise语法中使用函数作为参数(resolve、reject),而不是简单的返回和抛出?_Javascript_Promise_Es6 Promise - Fatal编程技术网

Javascript 为什么在Promise语法中使用函数作为参数(resolve、reject),而不是简单的返回和抛出?

Javascript 为什么在Promise语法中使用函数作为参数(resolve、reject),而不是简单的返回和抛出?,javascript,promise,es6-promise,Javascript,Promise,Es6 Promise,这是一个“为什么”的问题,不是一个建议。我知道下面的函数是不正确的,但它有助于澄清我的问题:我想知道这个观点有什么错误(即,我在这里遗漏了什么承诺要求)。答案可以帮助像我这样的人摆脱困惑。请提供一个例子,说明有必要满足承诺的以下要求: 我(错误地)认为承诺是为了推迟功能的执行,并分配一个then&catch链。我需要知道以下几点:为什么JavaScript承诺使用(解析、拒绝)而不是返回或抛出的无参数回调 在天真和不正确的观点中,Promise可以以更简单的方式使用(没有两个参数resolve,

这是一个“为什么”的问题,不是一个建议。我知道下面的函数是不正确的,但它有助于澄清我的问题:我想知道这个观点有什么错误(即,我在这里遗漏了什么承诺要求)。答案可以帮助像我这样的人摆脱困惑。请提供一个例子,说明有必要满足
承诺
的以下要求:

我(错误地)认为承诺是为了推迟功能的执行,并分配一个then&catch链。我需要知道以下几点:为什么JavaScript承诺使用(解析、拒绝)而不是返回或抛出的无参数回调

在天真和不正确的观点中,
Promise
可以以更简单的方式使用(没有两个参数
resolve
reject
),如下所示:

/*new*/ IncorrectPromise(()=>{
    let x = Math.random()>0.5;
    console.log('promise 1');
    if (x) {
        return 'head1';
    } else {
        throw new Error('tail1');
    }
})
.then((d)=>{
    console.log('.then() d=', d);
})
.catch( (ex) =>{
    console.log('.catch() e=', ex.message);
});
而不是承诺的方式:

new Promise( (resolve_, reject_) => {
    let y = Math.random()>0.5;
    console.log('promise 2');
    if (y) {
        resolve_('head2');
    } else {
        reject_(new Error('tail2'));
    }
})
.then((d)=>{
    console.log('              .then() d=', d);
})
.catch( (ex) =>{
    console.log('              .catch() e=', ex.message);
});
i、 e.当控制流退出承诺回调主体时,根据退出是由
返回
还是
抛出
引起的,使用resolve或reject

我的问题是,为什么承诺使用当前的语法?答案将是一个无法使用此(幼稚)函数完成的示例

使用以下定义可以很容易地模拟上述语法(为简单起见,请忽略以下事实:
IncorrectPromise
不是构造函数,因此不需要
new
运算符):


这种更简单的用法语法有什么缺点?设计者或
承诺使用(解析、拒绝)的意图是什么?

因为它们是函数,作为参数传递给回调函数。不是关键词。它们的名称是任意的,使用
resolve
reject
只是一种惯例。据我所知,
Promise
是一个类,而不是一个函数。它用于创建一个新的Promise对象,因此返回任何东西都没有意义。关键是它们是回调,您应该异步调用它们(如果不这样做,您就不需要Promise-您的示例片段非常容易误导)。executor回调不能同步地
返回
抛出
异步结果。@ChrisG我已经在问题中写过了。我的问题是关于其他方面的。@SohailSi是的,没错。因为它们是函数,作为参数传递给回调函数。不是关键词。它们的名称是任意的,使用
resolve
reject
只是一种惯例。据我所知,
Promise
是一个类,而不是一个函数。它用于创建一个新的Promise对象,因此返回任何东西都没有意义。关键是它们是回调,您应该异步调用它们(如果不这样做,您就不需要Promise-您的示例片段非常容易误导)。executor回调不能同步地
返回
抛出
异步结果。@ChrisG我已经在问题中写过了。我的问题是关于其他事情的。@SohailSi是的,没错。
function IncorrectPromise(callback) {
    return new Promise( (res, rej) => {
        try {
            res( callback() );
        } catch (err) {
            rej(err);
        }
    });
}