【问题标题】:Does then() really return a promise in all cases? [duplicate]then() 真的在所有情况下都返回一个承诺吗? [复制]
【发布时间】: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/…

标签: javascript promise


【解决方案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 的更多信息

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-10
      • 2016-06-16
      • 1970-01-01
      • 1970-01-01
      • 2016-03-09
      • 2020-07-08
      相关资源
      最近更新 更多