jQuery deferred:
jQuery deferred:
我有一个函数。函数内部看起来像:
if (isNewCustomer) {
doSomething();
cleanup();
}
else {
$.getJSON(..., function(result) {
doSomethingElse();
cleanup();
});
}
我希望我可以通过使用deferred来简单地做到这一点。我的尝试看起来像:
var do_it = doSomething;
if (!isNewCustomer) {
do_it = $.getJSON(..., function(result) {
doSomethingElse();
});
}
$.when(do_it).done(function() {
cleanup();
});
但这不起作用。我做错了什么?
EDIT:将变量do
重命名为do_it
。这不是代码的问题。问题是当do_it
是doSomething
时,doSomething
不会被执行。
do是javascript中的一个关键字,因此最好重命名变量。
var do_it = doSomething;
if (!isNewCustomer) {
do_it = $.getJSON(..., function(result) {
doSomethingElse();
});
}
// || << note me
$.when(do_it()).done(function() {
cleanup();
});
var result;
if (isNewCustomer) {
result = doSomething();
} else {
result = $.getJSON( ..., function( data ) {
doSomethingElse( data );
});
}
$.when( result ).done(function() {
cleanup();
});
请参阅上面的代码:您从未像Gigi指出的那样调用过函数。
看看这个jsfiddlehttps://jsfiddle.net/timlint/tg7xqtha/
使用Deferred是一种方法。有时很难理解流程以及如何传递数据,但这个例子可能会给你一些启示。
你几乎可以把延期看作一个标志。在函数中,您可以创建一个延迟对象。
该函数返回被延迟的。promise()。这允许您调用函数doSomething(bool).done(),并在它完成后执行某些操作。当您知道任务已完成,并且在此之前不会调用该任务时,您将解决延迟。
function doSomething(isNewCustomer)
{
// think of a deferred as a flag object in a way
var d = $.Deferred();
if(!isNewCustomer)
{
$.getJSON(..., function(result) {
// work with data
}).done(function() {
// finisn up data
// set deferred to resolved
d.resolve();
});
}
else
{
// some business logic
// set deferred to resolved
d.resolve();
}
// returning the promise lets you call .done()
// on this function call in the main call
return d.promise();
}
您需要一个显式的Deferred。如果您传递when()一个不是Deferred的参数,则会立即调用该函数,这可能就是您得到意外结果的原因。
var deferred = $.Deferred();
if (isNewCustomer) {
deferred.resolveWith(doSomething());
}
else {
$.getJSON(...).
done(function(result) {
deferred.resolveWith(doSomethingElse(result));
}).
fail(function(...) {
deferred.rejectWith(...);
});
}
deferred.promise().always(function() { cleanup(); });
相关文章:
- JQuery Deferred Ajax,将结果保存在调用对象中
- jQuery Deferred and promise-错误:对象没有't支持属性或方法'然后'
- 强制jQuery Deferred等待Ajax在“”中完成;那么“;处理程序
- 如何用JQuery$.Deferred重写AJAX调用
- jQuery deferred method and ajax beforeSend()
- 我可以将Promises传递给jQuery.when(),还是只传递Deferred
- jquery,在html5中使用带有地理位置的deferred
- jQuery Deferred/Promises with many getJSON
- jQuery $.Deferred with window.top.postMessage()
- 在jQuery中返回promise()或deferred有什么区别
- jQuery deferred:在fail()回调中抛出并捕获异常
- jQuery deferred:用于延迟函数的返回,直到函数内的异步调用完成+获取返回值
- jQuery Deferred和Promise用于同步和异步函数的顺序执行
- Basic jquery deferred usage with ajax
- 其中 deferred.resolveWith() 在 jQuery 中定义
- 角度等价于 jQuery deferred.always() 回调
- 学习Javascript/Jquery promise&deferred,当多次使用时出现问题
- 如何使用jQuery Deferred(何时/然后等)来修复末日问题的异步金字塔
- jQuery Deferred只返回循环中的最后一个值
- jQuery.Deferred in recursive cycle