search

Home  >  Q&A  >  body text

javascript - sea.js 能否像普通的接口一样返回信息,直接上例子

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中文网2817 days ago643

reply all(2)I'll reply

  • PHP中文网

    PHP中文网2017-04-10 16:19:55

    首先指出: 这和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/

    reply
    0
  • 怪我咯

    怪我咯2017-04-10 16:19:55

    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
        });
    }

    reply
    0
  • Cancelreply