【问题标题】:How to make call to a JavaScript promise cleaner?如何调用 JavaScript Promise Cleaner?
【发布时间】:2014-10-10 06:03:25
【问题描述】:

我有以下对 Javascript 承诺的调用:

deleteDatabase().then(function () {
    doSomeStuff();
}, function (err) {
    processError(err);
});

它工作正常,但它看起来真的很罗嗦。有没有办法有更简洁的方法来做到这一点?也许是这样的(这似乎不起作用):

deleteDatabase().then(doSomeStuff(), processError(err));

【问题讨论】:

  • 不要调用函数,直接传递。
  • Promise chain fundamental issue 和其他一些人的可能重复
  • 仅供参考,始终首先评估参数。所以如果你有foo(bar(baz));,那么bar首先被调用,其值为baz,然后foo被调用,返回值为bar。 JavaScript 可能有其怪癖,但这种评估与大多数其他语言一样。

标签: javascript promise


【解决方案1】:

你需要传递一个函数,而不是调用它们的结果:

deleteDatabase().then(doSomeStuff, processError);

当然,这会将deleteDatabase() 操作的结果传递给您的doSomeStuff 函数,因此如果您希望它没有参数,您将需要像以前一样使用函数表达式。

【讨论】:

  • 所以函数参数err 会自动传递给processError?
  • then 将错误对象传递给第二个函数。无论是带有err 参数的函数表达式还是processError 函数的函数表达式都不会影响它。
  • 你也可以通过 bind 消除不需要的参数:.then(doSomeStuff.bind(this,undefined));
  • 不,通过 Promise 链传递的参数对于使用 .bind() 建立的任何参数都是附加的。 “扼杀”此类参数的唯一方法是在 .then() 回调中忽略它。在您的示例中,undefined(或其他任何内容)不会神奇地掩盖 promise 传递的参数。
  • @Roamer-1888: dandavis 表示当函数只需要一个参数时,您可以通过绑定undefined 来“移出”结果。当然,这并不适用于所有事情,而且在 IMO 中是非常值得怀疑的。
【解决方案2】:

语法有问题

deleteDatabase().then(doSomeStuff, processError);

如果您将() 放在函数名之后,它将立即调用它,通过省略括号,您将传递对该函数的引用,并要求它在稍后的某个时候被 Promise 调用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-28
    • 1970-01-01
    • 2018-02-06
    • 1970-01-01
    • 2016-03-03
    • 1970-01-01
    相关资源
    最近更新 更多