我有两个javascript函数,save()并saveAll()设置如下:
function save(data) {
return $.post('/save', data);
}
function saveAll(callback) {
var dataArray = [];
$.each(dataArray, function() {
save(this);
});
callback();
}
Run Code Online (Sandbox Code Playgroud)
我有兴趣修改saveAll()它以利用jquery延迟对象,并在callback所有save()操作完成后引发该函数.但是,我不确定确切的语法...特别是与$ .when()内部的$ .each()有关.会是这样的吗?
function saveAll(callback) {
var dataArray = [];
$.when(
$.each(dataArray, function() {
return save(this);
})
).then(callback);
}
Run Code Online (Sandbox Code Playgroud) 我正在使用JqGrid,并且对于我正在加载的网格中的每一行,我正在进行ajax调用以获取其他数据.
一旦完成,我需要应用一些格式.
我想使用$ .when(),但我不确定如何调用它.我正在研究apply()方法,但我仍然没有看到如何正确使用它.
这是我的代码:
$(rows).each(function () {
$.ajax(
{
url: url,
data: data,
success: function (result) {
}
}
});
});
$.when(**What do i pass here??**).done(function () {
});
Run Code Online (Sandbox Code Playgroud)
我曾尝试将每个$ .ajax调用推送到一个数组,但我不能直接传递数组,并调用所有内容.
在此先感谢您的帮助!
我正在使用$.when链接一些Deferred对象,如果其中一个失败,则该always方法将在失败后直接调用,即使我仍然有一个处于"挂起"状态的延迟器.
var promises = [], defs = [];
for(var i=0 ; i < 10 ; i++){
defs.push($.Deferred());
promises.push(defs[i].promise());
}
var res = $.when.apply($, promises);
res.fail(function(){console.log('failed')});
res.done(function(){console.log('done')});
res.always(function(){console.log('always')});
res.then(function(){console.log('then, done')},
function(){console.log('then, failed')});
var j = 0;
var t = setInterval(function(){
if(j < 10){
if(j < 5) {
console.log('resolve');
defs[j++].resolve();
}
else {
console.log('reject');
defs[j++].reject();
}
}
else {
clearInterval(t);
}
}, 200);
Run Code Online (Sandbox Code Playgroud)
检查这个jsfiddle.
也许这是正常行为.但是,在这种情况下,即使其中一些失败,我如何才能抓住我的链条的末端?
我正在寻找一种方法在两个ajax调用完成后进行回调:
$.when(
call1(),
call2()
).always(function() {
// Here I want to be sure the two calls are done and to get their responses
);
Run Code Online (Sandbox Code Playgroud)
问题是其中一个调用可能会失败.所以,在我的代码中,总是会调用它而不等待另一个调用.
我怎样才能等待两个完成的呼叫(成功或失败)?
如果我把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) 我可以done()在"非ajax"函数上使用jquery吗?Uncaught TypeError: Cannot call method 'done' of undefined当我尝试做这样的事情时,我收到了错误.
function countThreeSeconds() {
var counter = 0,
timer = setInterval(function () {
if (counter == 3) {
console.log("All done. That was three seconds.");
window.clearInterval(timer);
} else {
console.log("Not there yet. Counter at: " + counter);
}
counter++;
}, 1000);
}
(function(){
var timer = countThreeSeconds().done(function(){
alert("done");
});
}());
Run Code Online (Sandbox Code Playgroud)
谢谢
有什么区别
var dfd = new $.Deferred
Run Code Online (Sandbox Code Playgroud)
和
var dfd = $.Deferred
Run Code Online (Sandbox Code Playgroud)
在哪些情况下你需要使用新的vs不使用它?
使用JQuery.Deferred时可以直接调用reject()吗?没有调用异步函数?
也许我想在异步函数的开头进行某种测试.如果测试失败,我想立即拒绝.请参阅下面的第一个if块.
function doSomethingAsync() {
//Test if the ajax call should be invoked
var testFailed = true;
var dfd = $.Deferred();
//Check if test failed
if (testFailed) {
var asyncResult = {
success: false,
data: 'test failed'
};
//Is this OK usage of reject on the same thread?
dfd.reject(asyncResult);
return dfd.promise();
}
$.get('/api/testapi/get').done(function (data) {
var asyncResult = {
success: true,
data: data
};
dfd.resolve(asyncResult);
}).fail(function (err) {
var asyncResult = {
success: false,
data: err
};
dfd.reject(asyncResult);
});
return …Run Code Online (Sandbox Code Playgroud) 请注意这是一个人为的例子.
function longFunc(){
var deferred = $.Deferred();
setTimeout(function(){
console.log("long func completed");
deferred.resolve("hello");
}, 3000);
return deferred.promise();
}
function shortAfterLongFunc(x){
console.log('short func completed with value: ' + x);
return {
a: x
};
}
processFurther(longFunc().then(shortAfterLongFunc)); // send the array for further processing
Run Code Online (Sandbox Code Playgroud)
问题
我无法弄清楚如何在shortAfterLongFunc完成后返回任何类型的对象/函数以进行进一步的下游处理.我可以来自console.log,shortAfterLongFunc但这不是我在这里要求的.
在这里小提琴
谢谢你的期待!
更新:
好的只是为了让我的问题稍微好一些......这是一个我正在看的简单用例:
$.map(['H','E','L','L', 'O'], somefunc). // for each item in array apply somefunc function
function somefunc(x){ // gets called for each value 'H', 'E' etc. in the …Run Code Online (Sandbox Code Playgroud) 以下代码段会在Chrome(和Safari)中生成错误,但在Firefox中可以使用.
我希望在javascript控制台中显示2个数字,但在Chrome中我只得到第一个然后是 Uncaught TypeError: Illegal invocation
// a generic promise that return a random float
var makePromise = function() {
return $.Deferred().resolve(Math.random());
}
// This works in all browsers
makePromise().then(function(d) {
console.log(d);
});
// This works in firefox only
makePromise().then(console.log);Run Code Online (Sandbox Code Playgroud)
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>Run Code Online (Sandbox Code Playgroud)
为什么会这样?
旁注:我的问题与这个问题不一样.
感谢评论和回答console.log用作回调,我们需要做
makePromise().then(console.log.bind(console));
Run Code Online (Sandbox Code Playgroud) jquery-deferred ×10
jquery ×8
javascript ×7
ajax ×2
angularjs ×1
firefox ×1
function ×1
promise ×1
websocket ×1