代码段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) { ... } })
我将$.ajax封装到函数函数中时,用promise写法打出的prepayment_operational是undefined。
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(); });
当我直接把ajax写在then中就能得到我想要的值。并且当我把代码段1中的
loadMain().then(loadBtn()).then(function () { console.log(prepayment_operational); // undefined return loadProgress(); });
改成
loadMain().then(function () {return loadBtn()}).then(function () { console.log(prepayment_operational); // undefined return loadProgress(); });
代码段1也能正常console出prepayment_operational。
想请教下这是为什么。
then
拿到的应该是一个函数,而不是其他的东西。。。loadMain().then(loadBtn)....
jQ里本身有Promise的(在deferred模块里),比如:
这种写法就是传统的,而:
这种就是用了jQ内置的Promise机制(
$.ajax
本身会返回Promise,可以挂.done()
或者.fail()
)。也可以用.promise()
动态返回promise对象。具体参考jQ文档的“延迟对象”吧。