V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a JavaScript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
JavaScript 权威指南第 5 版
Closure: The Definitive Guide
wz74666291
V2EX  ›  JavaScript

求问大神关于 js promise 的问题

  •  2
     
  •   wz74666291 · 2018-06-04 22:25:52 +08:00 · 3218 次点击
    这是一个创建于 2123 天前的主题,其中的信息可能已经有所发展或是发生改变。
    registerKeystroke() {
        var username = $('#id_username').val();
        var password = $('#id_password').val();
        return this._sendRequest('/pc_data/', {'username': username, 'password': password})
        .then(res1 => {
            console.log('res1:' + res1);
            this._change_status(res.toString());
            return res1
        })
        .then(
        this._sendRequest('/server/register_keystroke/', this._getRequestData())
        .then(res3 => {
            this._clearInputsTimestamps();
            console.log('res3:' + res3);
            return res3;
        })
    )
    
    _sendRequest(url, data) {
        return new Promise((resolve) => {
        $.post(
            url,
            JSON.stringify(data),
            (data) => resolve(data),
            'json'
        );
        })
        }
    }
    

    我想要 return 出 res3,给更后面的 then 函数用,可是现在 return 出来的是 true 值,res3 的记录值是 message,怎样才可以 return 出 res3 呢?

    第 1 条附言  ·  2018-06-09 13:08:06 +08:00
    感谢各位,已经成功了,就是 return 一个 promise,然后再用 then 进行下一步的操作就好了
    10 条回复    2018-06-09 11:42:10 +08:00
    lzvezr
        1
    lzvezr  
       2018-06-04 22:42:48 +08:00 via Android
    第二个.then 相当于.then(dosomething())并没有返回值吧,改成.then(() => dosomething())应该就行了
    klesh
        2
    klesh  
       2018-06-04 22:44:22 +08:00 via Android
    第二 then(后面插入 () => 试试?
    then 接受一个或两个 function,你给它传入一个 promise ?
    banxi1988
        3
    banxi1988  
       2018-06-04 23:01:18 +08:00
    async/await 了解一下。
    wly19960911
        4
    wly19960911  
       2018-06-04 23:16:37 +08:00
    return this._sendRequest('/server/register_keystroke/', this._getRequestData())
    .then(res3 => {
    this._clearInputsTimestamps();
    console.log('res3:' + res3);
    return res3;
    })

    试试看看,在 then 里面 return,
    shenyu1996
        5
    shenyu1996  
       2018-06-04 23:26:03 +08:00 via Android
    要异步的 return 值的话还是 async await 吧
    autoxbc
        6
    autoxbc  
       2018-06-05 01:01:47 +08:00
    按照标准模式写法,应该把 return res1 这句改成
    return this._sendRequest('/server/register_keystroke/', this._getRequestData()

    因为 then 的正确模式写法是
    then( value => {
    somethingSync();
    return new Promise( (resolve,reject) => {
    somethingAsync();
    } )
    } )
    wz74666291
        7
    wz74666291  
    OP
       2018-06-05 09:27:20 +08:00
    @klesh 这样 return 回来的值是 false,res3 也变成了 false 了
    9066v
        8
    9066v  
       2018-06-05 11:23:35 +08:00
    return res3 ==> return Promise.resolve(res3) 试下?
    hoythan
        9
    hoythan  
       2018-06-09 11:38:46 +08:00
    @banxi1988 async/await 好像 ES6 不推荐这个写法。
    hoythan
        10
    hoythan  
       2018-06-09 11:42:10 +08:00
    @banxi1988 抱歉看错了。


    建议所有异步均使用 Promise 实现,以便在未来享受 async 和 await 关键字带来的便携性。

    另外,虽然 Babel 可以转换 async 和 await 的代码,但不建议使用,因为转换出来的代码比较繁琐,且依赖于 generatorsRuntime。



    我以为文章说的是不推荐使用 async 和 await
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3045 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 12:48 · PVG 20:48 · LAX 05:48 · JFK 08:48
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.