then() 真的在所有情况下都返回一个承诺吗? [复制]

Posted

技术标签:

【中文标题】then() 真的在所有情况下都返回一个承诺吗? [复制]【英文标题】:Does then() really return a promise in all cases? [duplicate] 【发布时间】:2020-05-12 05:33:04 【问题描述】:

我的理解是then()promise 方法本身总是返回一个promise。 Promise 是我仍然习惯于成为一个新手的东西,所以我刚刚回顾了一些例子并进行了修补。以下示例显示then 方法的返回值是一个对象。

const foo = true;

const myPromise = new Promise((resolve, reject) => 
    setTimeout(() => 
        if (foo) 
            resolve('Do this');
         else 
            reject(Error("Do that"));
        
    , 1500)
)

const bar = myPromise.then(value => value);

console.log(typeof bar); // object

这和返回一个承诺一样吗?还是我需要明确告诉then 像这样返回一个承诺(伪代码,我知道不正确):

.then(value => 
    // do something 
    return new Promise;
)

我想确定我有这个。非常感谢您的帮助。

【问题讨论】:

你忘了.catch(function(error) .... 是的,then always 为相应回调的结果返回一个新的承诺。 如果该回调返回一个也将被等待的承诺,但如果回调返回一个普通值(甚至undefined),那么该承诺将简单地实现。 使用await -> const bar = await myPromise.then(value => value); console.log(typeof bar); // string typeof 不会告诉你某事是否是一个承诺。它为几乎任何类型的对象返回"object",包括promise。见:developer.mozilla.org/en-US/docs/Web/javascript/Reference/… 【参考方案1】:

是的then() 总是返回一个承诺。但是,伪代码不正确。函数then 有两个参数:

p.then(onFulfilled[, onRejected]);

p.then(value => 
  // fulfillment
, reason => 
  // rejection
);

Promise 构造函数完全一样。 Then 从另一个人那里创建一个承诺。我们经常省略onRejected 参数,因为我们使用catch 处理拒绝案例。

这里有一篇有趣的文章:https://medium.com/@kevinyckim33/what-are-promises-in-javascript-f1a5fc5b34bf

还有then 文档:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/then

【讨论】:

【参考方案2】:

是的,then() 方法返回一个 Promise。它最多需要两个参数:Promise 成功和失败情况的回调函数。

promise 是一个对象,promise 的 typeof 将是一个object。你不需要明确地返回一个承诺。

您可以阅读有关promises here 的更多信息

【讨论】:

以上是关于then() 真的在所有情况下都返回一个承诺吗? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

你能“累积”承诺结果形成一连串“那么”吗? [复制]

jQuery承诺,如何检查then()是否真的在when()之后?

从承诺返回 then()

在 then 块中拒绝返回的承诺

如何编写测试用例来覆盖承诺链中所有嵌套的“then”回调

承诺设计模式