javascript - sea.js 能否像普通的接口一样返回信息,直接上例子
PHP中文网
PHP中文网 2017-04-10 16:17:55
0
2
648
exports._returnBankCardInfo = function() { // 返回登录状态
    var result
    $.ajax({
        url: '/user/loginStatus?timestamp='+(new Date()).valueOf(),
        type: 'get',
        cache: false,
    })
    .done(function(result) {
        return result
    })
}
    
exports.showBankCardInfo = function() { // 使用通用接口返回的信息
    console.log(exports._returnBankCardInfo()) 
}

说明:
每次都需要查询用户登录状态,所以做成通用方法;showBankCardInfo 直接调用返回信息进行处理,问题是显示为 undefined,是不是我的格式写错了,sea.js 应该能够支持我说的应用。

PHP中文网
PHP中文网

认证高级PHP讲师

reply all(2)
Ty80

首先指出: 这和seajs没有半毛钱关系,是ajax造成的。究其原因,是你ajax的使用方式不正确。

如果你将ajax的async设为false,那这个函数就是对的,但是会很卡。这也是jquery后来弃用此参数的原因。

因此默认情况下,ajax是异步的。也就是说,ajax不会阻塞主线程,调用后立即返回

这好比: 你是 ajax的调用者,你有一个叫result的购物袋,你要去一个叫ajax的商店买东西。见到售货员,你说: “请给我数据。”

如果售货员微笑着说:“好的请稍等,我这就去给您拿。”转身离开,而你坐在柜台前干等。一段时间后,她回来了,将数据塞入你的购物袋。购物结束。这叫同步,即async为false的情况。

如果售货员微笑着说:“好的。不过这需要一定的时间。等我拿到了货物,会通过回调快递通知您,并送至您的住所。”于是,你可以转身离开回家,去看片打球干嘛都行。一段时间后,“叮咚”,货到了。购物结束。这叫异步。

而你干了什么呢?转身出商店后,你马上把result塞给另一个人,告诉他里面有数据。然而并没有,因为货还没到呢!

解决方法是: 使用 Defered 对象。事实上,ajax 函数返回值就是一个 Defered对象。这是一个类 Promise 的协议对象,主要是为了延迟异步回调的处理,消除回调地狱

这好比: 你跟那个人说:“我还没收到货呢?这样,你把你要对货干的事告诉我,等我拿到货第一时间帮你干。”

当然,这需要思维上的转变。毕竟这个架构和以往的顺序执行很不一样。

参考:

  • https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Promise

  • http://api.jquery.com/jQuery.ajax/

刘奇
exports._returnBankCardInfo = function() {
    return $.ajax({
        url: '/user/loginStatus?timestamp='+(new Date()).valueOf(),
        type: 'get',
        cache: false,
    });
}
    
exports.showBankCardInfo = function() {
    exports._returnBankCardInfo()
    .done(function(result){
          //这里使用你的result
    });
}
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template