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);
}
});
}