JavaScript中的Promises语法令人困惑

时间:2019-07-19 06:23:54

标签: javascript promise

要访问对象的方法,我们使用点运算符,例如nameOfObject.nameOfMethod()。这就是我对点运算符的理解。

对点运算符的这种理解并不能帮助我理解JavaScript中promise的语法。例如,参见下面的代码:

var askMom = function () {
    willIGetNewPhone // calling the promise
        .then(function (fulfilled1) {
            // yay, you got a new phone
            console.log(fulfilled);
        })
        .then(function (fulfilled2) {
            // yay, you got a new phone
            console.log(fulfilled2);
        })
        .catch(function (error) {
            // ops, mom don't buy it
            console.log(error.message);
        });
}

在我看来,代码似乎在说-nameOfObject.thenMehtod().thenMethod().catchMethod();

我如何理解这一点?在JavaSript中使用nameOfObject.method1().method2().method3;

调用对象的方法是否正常?

3 个答案:

答案 0 :(得分:2)

调用.then()时,您将像执行其他函数一样执行函数。然后,它返回一个承诺,也可以调用.then().catch()

这通常称为“链接”。

答案 1 :(得分:1)

此特定用法(promise.then(...).then(...))看起来很相似,但与您的示例object.method1().method2().method3()无关。在前一种情况(promise.then())中,每个后续.then()的结果都是一个新的Promise。在后一种情况下,所有方法通常都返回相同的对象,这使得可以进行链接,其中一个示例是EventEmitter

eventEmitter
  .on('event1', func1)
  .on('event2', func2);

在这里,每个.on()返回相同的实例,因此可以进行这种方法链接。要进行链接,每个方法(上例中的on)应返回当前实例(this)。

答案 2 :(得分:1)

基础很简单:a.function()接受输入并给出输出;输出可以是任何JavaScript object

现在,如果a.function()返回类似于a的内容怎么办?现在,您可以永远继续。这叫做 chaining -一个简单但功能强大的想法。

对于promisethen注册一个用promise的解析值调用的函数。为了使链接成为可能,它还会返回一个promise,并使用您提供给then的函数进行解析。如果您不明白,只需进一步阅读promises,它就会陷入困境。

使用arrow function语法希望这个小片段可以帮助您:

// getting the "resolver" to play around with
a = new Promise(_resolver_ => {resolver = _resolver_;});
// registering a "then"
b = a.then(result => {return result + 1;});
// resolving a
resolver(1);