Codeausschnitt 1
var prepayment_apply,prepayment_operational;
//
loadMain().then(loadBtn()).then(function () {
console.log(prepayment_operational); // undefined
return loadProgress();
});
// fun1
function loadMain() {
return $.ajax({
url:'...',
success:function (data) {
prepayment_apply = data.prepayment_apply;
}
})
}
// fun2
function loadBtn() {
return $.ajax({
url:'...',
success:function (data) {
prepayment_operational = data.prepayment_operational;
}
})
}
// fun3
$.ajax({
url:'...',
type:'get',
dataType:'json',
load_animation:true,
success:function (data) {
...
}
})
Wenn ich $.ajax in eine Funktion einkapsele, ist das mit „prepaid_operational“ eingegebene Versprechen undefiniert.
var prepayment_apply,prepayment_operational;
//
loadMain().then(function () {
$.ajax({
url: '...',
success: function (data) {
prepayment_operational = data.prepayment_operational;
}
})
}
)
.then(function () {
console.log(prepayment_operational); // '111'
return loadProgress();
});
Wenn ich dann direkt Ajax schreibe, kann ich den gewünschten Wert erhalten. Und wenn ich das
in Snippet 1 eingefügt habeloadMain().then(loadBtn()).then(function () {
console.log(prepayment_operational); // undefined
return loadProgress();
});
wurde zu
geändertloadMain().then(function () {return loadBtn()}).then(function () {
console.log(prepayment_operational); // undefined
return loadProgress();
});
Codesegment 1 kann prepaid_operational auch normal trösten.
Ich würde gerne fragen, warum das so ist.
then
拿到的应该是一个函数,而不是其他的东西。。。loadMain().then(loadBtn)....
jQ里本身有Promise的(在deferred模块里),比如:
这种写法就是传统的,而:
这种就是用了jQ内置的Promise机制(
$.ajax
本身会返回Promise,可以挂.done()
或者.fail()
)。也可以用.promise()
动态返回promise对象。具体参考jQ文档的“延迟对象”吧。