我有一个返回jQuery Promise的函数。看起来像这样:
addBooks(books: Array<Books>) {
return $.ajax({
url: '/Books/AddBooks/',
type: 'POST',
data: ko.toJSON(books),
contentType: 'application/json'
});
}
我这样做是为了重用此函数,并链许诺回调,例如:
addBooks.done(() => { alert("Books added!"); })
我的问题是,如果我想尽早退出addBooks并阻止访问服务器,该怎么办?例如:
addBooks(books: Array<Books>) {
// An empty array was passed in for some reason.
// Theres nothing to add so dont try to POST
if (books <= 0) return null;
return $.ajax({
url: '/Books/AddBooks/',
type: 'POST',
data: ko.toJSON(books),
contentType: 'application/json'
});
}
我的示例无法编译,因为我的链接完成的回调示例期望addBooks
返回一个Promise对象,而不是null。我怎样才能返回一个空的承诺(或者在这种情况下我应该返回什么正确的对象)?
我怎样才能返回一个空的承诺(或者在这种情况下我应该返回什么正确的对象)?
是的,这里的“空承诺”是适当的,如果您的意思是已经没有任何履行的承诺(undefined
,null
)。
创建此类的jQuery语法仅使用$.when
一个(或不使用)参数:
if (books <= 0) return $.when(null);
您可以返回已解决的承诺:
if (books <= 0) return null;
采用
if (books <= 0) return $.Deferred().resolve();
但是请注意,jQuery的Promise
API会产生令人惊讶的效果:有时它会调用您的done
/ then
/ etc。与同步回调done
/then
的/ etc。打电话,有时却没有。大多数promise库都确保该调用始终是异步的,即使您正在调用done
/ then
/ etc。坚定地承诺。jQuery没有,因此您会得到细微的差别。
例如,此代码:
addBooks(() => console.log(1));
console.log(2);
...将记录
2 1个
...如果您进行了ajax调用,但是
1个 2
...如果您返回了已解决的承诺。
来自https://api.jquery.com/jquery.when/
如果您不传递任何参数,
jQuery.when()
将返回已解决的Promise。
例如
if (books <= 0) return $.when();
并且,如果您需要传递未定义的值:
如果将单个参数传递给jQuery.when(),而不是Deferred或Promise,它将被视为已解析的Deferred,任何附加的doneCallbacks都将立即执行。doneCallbacks传递给原始参数。
例如,传递一个空数组:
if (books <= 0) return $.when([]);
例如,传递了一个空对象:
if (books <= 0) return $.when({});
文章标签:ajax , javascript , jquery , jquery-deferred , typescript
版权声明:本文为原创文章,版权归 admin 所有,欢迎分享本文,转载请保留出处!
评论已关闭!