如何在不从DOM中删除元素的情况下取消承诺?
我运行了这段代码:
$("#box")
.delay(2000)
.show("slow")
.delay(2000)
.promise()
.then(function(){log("Done");});
Run Code Online (Sandbox Code Playgroud)
在此之后,有没有办法取消承诺?双方clearQueue()并stop(true)没有工作,因为这不是我想要取消的动画.我看到remove()应该这样做......但我只想停止承诺,而不是删除整个元素.
我有一个$.ajax承诺,想检查我的(语法上有效)响应是否包含错误,在这种情况下触发被拒绝的状态.
我使用自己的诺言库来轻松处理这些任务.我真的不喜欢jQuery的Promise(缓存)实现及其Deferred对象,可能忽略了一些东西,因为我很少使用它.我认为要走的路只是使用.then(),这似乎相当复杂:
return $.ajax(...).then(function success(response) {
var problem = hasError(response);
if (problem) {
var error = new $.Deferred;
error.reject(problem);
return error;
} else
return response;
});
Run Code Online (Sandbox Code Playgroud)
这应该返回一个在网络错误或响应问题时被拒绝的承诺.但是回归被拒绝的推迟真的是[唯一|最好|最短]的方式去?
我也会在ajax选项中自己如何处理这些"错误抛出响应处理程序"的帮助,我找不到关于它们的好文档.
免责声明:不,我无法更改服务器响应.问题检测方法是同步的.我不想使用其他库,我对jQuery解决这个问题的方式特别感兴趣.
我有一个充满这样功能的对象:
var functions = {
fun1 : function(){ ... }
fun2 : function(){ ... }
fun3 : function(){ ... }
};
Run Code Online (Sandbox Code Playgroud)
对象键都在数组中引用,如下所示:
var funList = ['fun1','fun2','fun3'];
Run Code Online (Sandbox Code Playgroud)
我一直在使用该数组来运行所有函数:
$.each(funList, function(i,v){
functions[v].call(this, args);
});
Run Code Online (Sandbox Code Playgroud)
我的问题是这个,我需要一些方法来推迟所有功能的运行,这样:
我已经读过我应该使用$ .map方法,但是我很难把它包裹起来.
我试图让一个javascript对象运行一个延迟方法,当它的.done()调用同一个对象中的一个函数时.我有问题,因为"this"成为延迟对象而不是调用它的对象.
PageObject.prototype.successFunction = function() {
console.log(arguments);
return console.log(this.name + " Success function called");
};
PageObject.prototype.loadPage = function(url) {
return $.when($.mobile.loadPage("pages/" + url))
.done(this.successFunction);
};
var pg = new PageObject();
pg.loadPage("test.html");
Run Code Online (Sandbox Code Playgroud)
如何将"this"发送到successFunction?这个PageObject也将被其他人扩展,因此在运行successFunction时知道"this"将非常方便.
这似乎很简单,可能有一个简单的答案.我正在研究.apply(),但我不确定它是否有帮助.关于堆栈溢出的这篇文章有点帮助,但是它把它放入.done()函数的那一刻就打破了.
我有一个ajax帖子:
$.post("/api/v1/payment_methods/create_credit_card", values)
.done (response) ->
console.log("GOOD JOB")
.fail (response) ->
console.log("Adas")
Run Code Online (Sandbox Code Playgroud)
响应是201,然而,完成似乎没有捕获它,而是它将失败.我认为201会被认为是成功的,并且会被完成捕获.为什么它不起作用的任何想法?
注意:上面的代码是在coffeescript中,它并没有真正影响问题,但解释了我的语法
非常简单的问题,我想我可以解决这个问题,但答案已经让我失望了.
是否可以清除/删除已连接的处理程序到延迟对象完成/失败/始终队列.
var dfd = $.Deferred()
dfd.done(foo).fail(bar);
// User interacts with the page in a way that I do not want to fire foo or bar
// when dfd is resolved or rejected
<<answer here>>
Run Code Online (Sandbox Code Playgroud) 我试图通过向服务器发送GET请求来检查互联网连接.我是jquery和javascript的初学者.我没有使用navigator.onLine我的代码,因为它在不同的浏览器中的工作方式不同.到目前为止这是我的代码:
var check_connectivity={
is_internet_connected : function(){
var dfd = new $.Deferred();
$.get("/app/check_connectivity/")
.done(function(resp){
return dfd.resolve();
})
.fail(function(resp){
return dfd.reject(resp);
})
return dfd.promise();
},
}
Run Code Online (Sandbox Code Playgroud)
我将此代码称为不同的文件:
if(!this.internet_connected())
{
console.log("internet not connected");
//Perform actions
}
internet_connected : function(){
return check_connectivity.is_internet_connected();
},
Run Code Online (Sandbox Code Playgroud)
该is_internet_connected()函数返回一个延迟对象,而我只需要一个真/假的答案.谁能告诉我如何实现这个目标?
我有一个简单的url数组,我想用jQuery加载每一个.我正在使用$.get,但我似乎无法使用它$.Deferred,所以我切换到$.ajax- 我几乎让它工作,但我得到的结果是......奇怪的.我希望有人能帮我把这项工作做得更好.
var results = [], files = [
'url1', 'url2', 'url3'
];
$.when(
$.ajax(files[0]).done(function(data) {
results.push(data); console.log("step 1.0");
}),
$.ajax(files[1]).done(function(data) {
results.push(data); console.log("step 1.1");
}),
$.ajax(files[2]).done(function(data) {
results.push(data); console.log("step 1.2");
})
).then(function(){
console.log("step 2");
});
Run Code Online (Sandbox Code Playgroud)
这应该输出..
然后该results数组包含所有3个ajax请求的结果.这可能吗?
Javascript Promises与jQuery Deferred Objects的优缺点是什么?
例如,他们每个人都有什么问题,如果有的话?
一个堆栈溢出成员说:
"......真正的承诺是真实的,虚假的承诺是假的."
这是什么意思?
如果我把connect从doStuff,我得到的消息"套接字连接",但callback不叫.我在这里错过了什么?
$scope.connect = function() {
var defer = $q.defer();
ws = new WebSocket("ws://server.com:port");
ws.onopen = function(){
console.log("Socket connected");
defer.resolve("socket connected");
};
return defer.promise;
}
$scope.doStuff = function() {
$scope.connect().then(function(data) {
console.log("And we're off!", data);
});
}
Run Code Online (Sandbox Code Playgroud) jquery-deferred ×10
jquery ×8
javascript ×6
promise ×4
ajax ×1
angularjs ×1
arrays ×1
asynchronous ×1
coffeescript ×1
sequential ×1
websocket ×1