Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/421.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 无法理解MDN文档中带有Promise.prototype.then()的说明_Javascript_Node.js_Promise - Fatal编程技术网

Javascript 无法理解MDN文档中带有Promise.prototype.then()的说明

Javascript 无法理解MDN文档中带有Promise.prototype.then()的说明,javascript,node.js,promise,Javascript,Node.js,Promise,我正在学习将Node.js代码样式从回调转换为承诺,这似乎是一种趋势,而且它有很多优点。为了避免误解承诺的要点和好处,我正在阅读 . 我可以理解本页中的示例,但我不清楚注释在文件开头提到: 注:。。。如果省略了第一个参数或提供了非函数, 创建的新承诺只是采用了 然后被召唤的承诺(如果它实现了)。如果 第二个参数被省略或提供了一个非函数,新的承诺是 被创建只是采用了承诺的拒绝状态,然后被称为 打开(如果被拒绝) 如果这是琐事,请提前道歉。 希望通过示例进行解释,谢谢。编辑:更新以更好地匹配规范-请

我正在学习将Node.js代码样式从回调转换为承诺,这似乎是一种趋势,而且它有很多优点。为了避免误解承诺的要点和好处,我正在阅读 . 我可以理解本页中的示例,但我不清楚注释在文件开头提到:

注:。。。如果省略了第一个参数或提供了非函数, 创建的新承诺只是采用了 然后被召唤的承诺(如果它实现了)。如果 第二个参数被省略或提供了一个非函数,新的承诺是 被创建只是采用了承诺的拒绝状态,然后被称为 打开(如果被拒绝)

如果这是琐事,请提前道歉。 希望通过示例进行解释,谢谢。

编辑:更新以更好地匹配规范-请参阅和

.then
方法调用两个函数中的一个,具体取决于它所附加的承诺是否履行或拒绝。然后,它根据该调用的结果返回一个新的承诺。这允许您根据承诺是否成功运行不同的逻辑,并使您能够轻松地将承诺链接在一起

但是,如果您决定不传入其中一个函数,它将使用合理的默认值——这正是您发布的注释所指的。不过,演示可能比描述容易得多


如果省略了
onRejected
回调,如下所示:

myPromise.then(function (value) {
    console.log("success!");
});
myPromise.then(null, function (reason) {
    console.log("fail!");
});
结果与执行此操作相同:

myPromise.then(function (value) {
    console.log("success!");
}, function (reason) {
    throw reason;
});

如果省略了
oncompleted
回调,如下所示:

myPromise.then(function (value) {
    console.log("success!");
});
myPromise.then(null, function (reason) {
    console.log("fail!");
});
结果如下所示:

myPromise.then(function (value) {
    return value; // the same as returning Promise.resolve(value)
}, function (reason) {
    console.log("fail!");
});

如果你把两者都漏掉。。。这基本上毫无意义,但仍然:

myPromise.then();
这实际上与:

myPromise.then(function (value) {
    return value;
}, function (reason) {
    throw reason;
});
这反过来基本上就是:

myPromise
编辑:更新以更好地匹配规范-请参阅和

.then
方法调用两个函数中的一个,具体取决于它所附加的承诺是否履行或拒绝。然后,它根据该调用的结果返回一个新的承诺。这允许您根据承诺是否成功运行不同的逻辑,并使您能够轻松地将承诺链接在一起

但是,如果您决定不传入其中一个函数,它将使用合理的默认值——这正是您发布的注释所指的。不过,演示可能比描述容易得多


如果省略了
onRejected
回调,如下所示:

myPromise.then(function (value) {
    console.log("success!");
});
myPromise.then(null, function (reason) {
    console.log("fail!");
});
结果与执行此操作相同:

myPromise.then(function (value) {
    console.log("success!");
}, function (reason) {
    throw reason;
});

如果省略了
oncompleted
回调,如下所示:

myPromise.then(function (value) {
    console.log("success!");
});
myPromise.then(null, function (reason) {
    console.log("fail!");
});
结果如下所示:

myPromise.then(function (value) {
    return value; // the same as returning Promise.resolve(value)
}, function (reason) {
    console.log("fail!");
});

如果你把两者都漏掉。。。这基本上毫无意义,但仍然:

myPromise.then();
这实际上与:

myPromise.then(function (value) {
    return value;
}, function (reason) {
    throw reason;
});
这反过来基本上就是:

myPromise

其他答案提供了很好的解释,但使用跳过的概念来表达这一点可能更容易

如果承诺实现了,则首先调用
参数,然后调用
(只要它是一个函数);如果承诺拒绝,则调用
第二个参数,然后调用
(只要它存在并且是函数)。在其他情况下,
.then
被跳过

纯粹主义者会反对说<代码>是不正确的,然后<代码>被“跳过”,而真正发生的是<代码>。然后<代码>创建了一个与原始承诺等价(或假设其状态)的新承诺。这在技术上是正确的,但非正式地讲,谈论和思考
会更容易。然后
会被“跳过”

示例:

function log(v) { console.log("value", v); }
function err(e) { console.log("error", e); }

Promise.resolve(1).then(null, err).then(log);
                   ^^^^^^^^^^^^^^^ "SKIPPED" (onFulfilled is null)

Promise.reject(1).then(log).catch(err);
                  ^^^^^^^^^        "SKIPPED" (onRejected is not given)
为完整起见,
catch
的相应行为为:

如果承诺被拒绝,则调用
catch
的参数(只要它是函数)。在其他情况下,跳过
.catch

如果仔细考虑,您会发现这一切都意味着
。那么(null,handler)
在各个方面都与
.catch(handler)
完全等价。因此,
catch
可以看作是一种方便的例行程序

但是允许但忽略非函数处理程序有什么意义呢?他们不应该抛出一个
类型错误
或其他什么吗?实际上,这是一个“功能”,可以按如下方式使用:

promise.then(isWednesday && wednesdayHandler)

如果是星期三,那么这将计算为
wednesdayHandler
,我们可以进行一些特殊的星期三处理。现在不是星期三,那么这将计算为
false
,这显然不是一个函数,因此整个
then
子句将被“跳过”。

其他答案提供了很好的解释,但使用跳过的概念可能更容易表达这一点

如果承诺实现了,则首先调用
参数,然后调用
(只要它是一个函数);如果承诺拒绝,则调用
第二个参数,然后调用
(只要它存在并且是函数)。在其他情况下,
.then
被跳过

纯粹主义者会反对说<代码>是不正确的,然后<代码>被“跳过”,而真正发生的是<代码>。然后<代码>创建了一个与原始承诺等价(或假设其状态)的新承诺。这在技术上是正确的,但非正式地讲,谈论和思考
会更容易。然后
会被“跳过”

示例:

function log(v) { console.log("value", v); }
function err(e) { console.log("error", e); }

Promise.resolve(1).then(null, err).then(log);
                   ^^^^^^^^^^^^^^^ "SKIPPED" (onFulfilled is null)

Promise.reject(1).then(log).catch(err);
                  ^^^^^^^^^        "SKIPPED" (onRejected is not given)
为了完整性,corresp