返回和不返回另一个承诺的`then`块内的promise的区别

时间:2018-01-31 18:22:09

标签: javascript promise

究竟有什么区别?在下面的两个场景中,# File: django.views.generic.edit class FormMixin(ContextMixin): ... def form_valid(self, form): """If the form is valid, redirect to the supplied URL.""" return HttpResponseRedirect(self.get_success_url()) def form_invalid(self, form): """If the form is invalid, render the invalid form.""" return self.render_to_response(self.get_context_data(form=form)) def get_context_data(self, **kwargs): """Insert the form into the context dict.""" if 'form' not in kwargs: kwargs['form'] = self.get_form() return super().get_context_data(**kwargs) 有哪些差异?

以下是示例:

案例1.回复承诺

myPromise

案例2.未返回承诺

function test() {
  return somePromise.then(() => {
    return anotherPromise.then(res => {
      console.log('Result:', res);
    });
  }).catch(err => {
    console.error(err);
  });
}

const myPromise = test();

4 个答案:

答案 0 :(得分:2)

第一种情况是“promise chaining”,这是一个非常常见且有用的工具。通过从.then()处理程序返回一个promise,您告诉父承诺您希望它等到返回的promise在解析之前完成。这允许您创建一系列事件,并通过监视顶级承诺来了解整个序列的完成时间。任何观看父承诺的人只有在“链式”承诺也被解决或拒绝时才会看到决心或拒绝。来自链式承诺的错误将向上传播。

此外,父承诺的已解决值将成为已链接承诺的已解决值。

第二种情况是刚开始一个新的承诺链,它没有以任何方式连接到原始承诺链。它不会传播错误,父承诺也不会等待它。这有点像一个“即发即弃”的操作,你单独运行它,但根本不将它连接到父操作。

这通常是一个“错误”(尽管偶尔会出现一种情况,您希望启动新的异步操作并且不会将其成功或失败报告给任何人)。在您显示的代码中,如果anotherPromise被拒绝,您会收到有关未处理拒绝的警告,因为它没有链接,也不会传播到您的.catch()

答案 1 :(得分:1)

第一种情况将等到anotherPromise解决拒绝,然后将执行传递给下一个then {{1}使用 somePromise 已解决已拒绝值。因此链是由anotherPromiseanotherPromise的值组成的。

第二个只是运行内部承诺,忘记它并将执行返回到somePromise then,其中已解决已被拒绝 somePromise 的值。因此,链仅由somePromise

的值组成

答案 2 :(得分:1)

好吧,如果嵌套的promise有问题,第二个catch块就不会被命中。

答案 3 :(得分:1)

在第一种情况下,myPromisesomePromiseanotherPromise都已解决之前无法解决。

在第二种情况下,myPromise会在somePromise结算后立即解决。此外,catch处理程序如果拒绝,则不会从anotherPromise捕获任何错误。

后者通常是一种反实践,因为它是“火与忘记”的一个例子。代码。

请记住,你也正在建立一个厄运金字塔。那里。这两个例子的一个更好的方法是:

function test() {
  return somePromise
    .then(() => anotherPromise)
    .then(res => {
      console.log('Result:', res);
    })
    .catch(err => {
      console.error(err);
    });
}

const myPromise = test();