• Promise(避免金字塔回调)


    前后端分离开发,前端通过接口获取数据,但是有的页面不止一个接口,就会出现金字塔回调,可以通过 Promise 封装请求。

    request-data.js:

    function reqData(posturl, req, res, callback) {//请求用户数据
        request({
            url: con.url + posturl,
            method: "POST",
            json: true,
            headers: {
                
            }
        }, function (error, response, body) {
            if (!error && response.statusCode == 200) {
                callback(body.code, body.data, null);
            } else {
                callback(null, null, "error");
            }
        });
    }
    
    function reqPostData(posturl, bodyData, req, res, callback) {//请求用户数据
        request({
            url: con.url + posturl,
            method: "POST",
            json: true,
            headers: {
                
            },
            body: bodyData
        }, function (error, response, body) {
            if (!error && response.statusCode == 200) {
                callback(body.code, body.data, null);
            } else {
                callback(null, null, "error");
            }
        });
    }

    viewData.js:

    //引入数据请求模块
    var requestData = require('./request-data');
    
    function getNoParam(postUrl,req, res,describe) {
        var describe = describe || '数据';
        //创建Promise对象
        var p = new Promise(function(resolve, reject){
            //发送获取相应数据的请求
            requestData.reqData(postUrl, req, res, function (code, data, err) {
                if (code == 0) {
                    //成功返回数据
                    resolve({Data:data});
                } else {
                    //失败说明原因
                    reject(describe + "获取失败:" + data);
                }
            });
        });
        return p;
    
    }
    
    function getWithParam(postUrl, postData,req, res,describe){
        var describe = describe || '数据';
        //创建Promise对象
        var p = new Promise(function(resolve, reject){
            //发送获取相应数据的请求
            requestData.reqPostData(postUrl, postData, req, res, function (code, data, err) {
                // console.log(code, data, err);
                if (code == 0) {
                    //成功返回数据
                    resolve({Data:data});
                } else {
                    //失败说明原因
                    reject(describe + "获取失败:" + data);
                }
            });
        });
        return p;
    }

    路由文件调用:

    var viewData = require('../modules/viewData');
    
    /*商品列表*/
    router.get('/list', function (req, res) {
        Promise
            .all([viewData.getNoParam('/user/hot_list', req, res, '热门列表'), viewData.getWithParam('/user/recommend_list', {id: req.query.id}, req, res, '推荐列表')])
            .then(
                function (results) {
                    res.render('index/pay_complet', {
                        title: '商品列表',
                        hot: results[0].Data,
                        rm: results[1].Data
                    });
                },
                function (reason) {
                    //console.log(reason);
                    res.render('common/error', {title: '错误', message: reason});
                }
            );
    });
  • 相关阅读:
    使用QOAuth来进行新浪/腾讯微博验证(二)
    很不错的Utility库,C#4扩展 各种功能齐全,两行代码搞定图片转字符
    使用QOAuth来进行新浪/腾讯微博验证(一)
    可怜的小猪&香农熵
    消息队列MQ如何保证消息不丢失
    40 亿个 QQ 号码如何去重,bitmap去重
    参数的设置
    自动化测试的十个要点
    LR学习中的一个低级错误
    Windows下用CMake编译libuv
  • 原文地址:https://www.cnblogs.com/gxp69/p/9660770.html
Copyright © 2020-2023  润新知