究竟有什么区别?在下面的两个场景中,# 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)
有哪些差异?
以下是示例:
myPromise
function test() {
return somePromise.then(() => {
return anotherPromise.then(res => {
console.log('Result:', res);
});
}).catch(err => {
console.error(err);
});
}
const myPromise = test();
答案 0 :(得分:2)
第一种情况是“promise chaining”,这是一个非常常见且有用的工具。通过从.then()
处理程序返回一个promise,您告诉父承诺您希望它等到返回的promise在解析之前完成。这允许您创建一系列事件,并通过监视顶级承诺来了解整个序列的完成时间。任何观看父承诺的人只有在“链式”承诺也被解决或拒绝时才会看到决心或拒绝。来自链式承诺的错误将向上传播。
此外,父承诺的已解决值将成为已链接承诺的已解决值。
第二种情况是刚开始一个新的承诺链,它没有以任何方式连接到原始承诺链。它不会传播错误,父承诺也不会等待它。这有点像一个“即发即弃”的操作,你单独运行它,但根本不将它连接到父操作。
这通常是一个“错误”(尽管偶尔会出现一种情况,您希望启动新的异步操作并且不会将其成功或失败报告给任何人)。在您显示的代码中,如果anotherPromise
被拒绝,您会收到有关未处理拒绝的警告,因为它没有链接,也不会传播到您的.catch()
。
答案 1 :(得分:1)
第一种情况将等到anotherPromise
将解决或拒绝,然后将执行传递给下一个then
{{1}使用 somePromise
的已解决或已拒绝值。因此链是由anotherPromise
和anotherPromise
的值组成的。
第二个只是运行内部承诺,忘记它并将执行返回到somePromise
then
,其中已解决或已被拒绝 somePromise
的值。因此,链仅由somePromise
。
答案 2 :(得分:1)
好吧,如果嵌套的promise有问题,第二个catch
块就不会被命中。
答案 3 :(得分:1)
在第一种情况下,myPromise
在somePromise
和anotherPromise
都已解决之前无法解决。
在第二种情况下,myPromise
会在somePromise
结算后立即解决。此外,catch
处理程序如果拒绝,则不会从anotherPromise
捕获任何错误。
后者通常是一种反实践,因为它是“火与忘记”的一个例子。代码。
请记住,你也正在建立一个厄运金字塔。那里。这两个例子的一个更好的方法是:
function test() {
return somePromise
.then(() => anotherPromise)
.then(res => {
console.log('Result:', res);
})
.catch(err => {
console.error(err);
});
}
const myPromise = test();