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

一个涉及 Javascript 回调函数的问题,请大牛帮忙看看

  •  
  •   bru · 2015-10-16 10:05:49 +08:00 · 2299 次点击
    这是一个创建于 3334 天前的主题,其中的信息可能已经有所发展或是发生改变。
    app.reg(regInfo, function(err) {
        if (err) {
            toast(err);
            return;
        }
        toast('注册成功');
        // 注册成功,继续处理业务
    });
    
    app.reg = function(regInfo, callback) {
        if (regInfo.account.length < 5) {
            return callback('用户名最短需要 5 个字符');
        }
        if (regInfo.password.length < 6) {
            return callback('密码最短需要 6 个字符');
        // 向服务器发送注册请求
        user.signUp(regInfo, {
            success: function(user) {
                // 注册成功,可以使用了.
            },
            error: function(user, error) {
                // 失败了
            }
        });
        return callback();
    };
    

    问题: 如何在服务器返回失败以后再返回callback('服务器注册失败')?

    谢谢大家!

    8 条回复    2015-10-16 11:45:39 +08:00
    will0404
        1
    will0404  
       2015-10-16 10:10:37 +08:00
    ```
    app.reg = function(regInfo, callback) {
    if (regInfo.account.length < 5) {
    return callback('用户名最短需要 5 个字符');
    }
    if (regInfo.password.length < 6) {
    return callback('密码最短需要 6 个字符');
    // 向服务器发送注册请求
    user.signUp(regInfo, {
    success: function(user) {
    // 注册成功,可以使用了.
    },
    error: function(user, error) {
    // 失败了
    return callback();
    }
    });

    };
    ```
    will0404
        2
    will0404  
       2015-10-16 10:12:33 +08:00
    怎么不支持 markdown 你要的不是发 callback 放到回调里就好了吗
    chairuosen
        3
    chairuosen  
       2015-10-16 10:14:05 +08:00   ❤️ 1
    把倒数第二行 return callback()那行删了
    user.signUp 的 success 和 error 里分别调 callback
    bru
        4
    bru  
    OP
       2015-10-16 11:10:08 +08:00
    @chairuosen OK, 解决了,我之前也是在回调里面用了 return callback(); 直接调 callback 就可以了,谢谢~~
    Altman
        5
    Altman  
       2015-10-16 11:11:09 +08:00
    用用 Promise 吧, 实在看不下去 callback 回调了
    bru
        6
    bru  
    OP
       2015-10-16 11:25:39 +08:00
    @Altman 引入 Promise 对于原有的代码改动的工作主要有哪些?
    morethansean
        7
    morethansean  
       2015-10-16 11:34:42 +08:00
    没有 callback 了。
    app.reg = function (regInfo) {
    if (regInfo.account.length < 5) {
    return Promise.reject('用户名最短需要 5 个字符');
    }
    if (regInfo.password.length < 6) {
    return Promise.reject('密码最短需要 6 个字符');

    return user.signUp(regInfo);
    };

    // 使用
    app.reg(regInfo)
    .then((ret) => {
    // 成功了
    })
    .catch((ex) => {
    // 失败了
    });

    // es7
    try {
    await app.reg(regInfo);
    } catch (ex) {
    // 失败了
    return;
    }
    // 成功,继续业务代码
    malcolmyu
        8
    malcolmyu  
       2015-10-16 11:45:39 +08:00
    要么使用回调要么使用 promise
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   921 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 20:17 · PVG 04:17 · LAX 12:17 · JFK 15:17
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.