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});
}
);
});
Promise(避免金字塔回调)的更多相关文章
- ES6(promise)_解决回调地狱初体验
一.前言 通过这个例子对promise解决回调地狱问题有一个初步理解. 二.主要内容 1.回调地狱:如下图所示,一个回调函数里面嵌套一个回调函数,这样的代码可读性较低也比较恶心 2.下面用一个简单的例 ...
- jquery.Deferred promise解决异步回调
我们先来看一下编写AJAX编码经常遇到的几个问题: 1.由于AJAX是异步的,所有依赖AJAX返回结果的代码必需写在AJAX回调函数中.这就不可避免地形成了嵌套,ajax等异步操作越多,嵌套层次就会越 ...
- 【JavaScript】 使用Async 和 Promise 完美解决回调地狱
很久以前就学习过Async和Promise,但总是一知半解的. 今天在写NodeJS的时候,发现好多第三方库使用回调,这样在实际操作中会出现多重回调,这就是传说中的JS回调地狱. 举个例子 有一个方法 ...
- ES6(promise)_解决回调嵌套简单应用
一.前言 这个小案例是在node平台上应用的所以需要保证你的电脑: 1.安装和配置node.js环境 2.需要用node.js来开启一个http-server: 开启方法:https://blog.c ...
- 使用ES6的Promise完美解决回调地狱
相信经常使用ajax的前端小伙伴,都会遇到这样的困境:一个接口的参数会需要使用另一个接口获取. 年轻的前端可能会用同步去解决(笑~),因为我也这么干过,但是极度影响性能和用户体验. 正常的前端会把接口 ...
- promise对象的回调函数resolve的参数为另一个promise对象
/*如果调用resolve函数和reject函数时带有参数,那么它们的参数会被传递给回调函数. reject函数的参数通常是Error对象的实例,表示抛出的错误: resolve函数的参数除了正常的值 ...
- promise对象解决回调地狱
先放一张图片感受一下回调地狱 看起来是真的很让人头痛的东西 而现在我这里使用promise对象来解决回调地狱 采用链式的 then,可以指定一组按照次序调用的回调函数. 这时,前一个 then 里的一 ...
- ES6新增"Promise"可避免回调地狱
Promise是一个构造函数,自己身上有all.reject.resolve这几个眼熟的方法,原型上有then.catch等同样很眼熟的方法. 那就new一个 var p = new Promise( ...
- Promise对象和回调函数,解决异步数据传递问题
下面的代码例子,均已小程序的异步请求数据为案例来说明 1.利用回调函数,来解决异步数据传递问题 异步操作api.js const getBooks = (url, callback) => { ...
随机推荐
- JS的事件绑定、事件流模型
.t1 { background-color: #ff8080; width: 1100px; height: 40px } 一.JS事件 (一)JS事件分类 1.鼠标事件:click/dbclick ...
- github page 配置hexo 博客 的常见错误
缘起 最近看到好多的公众号作者推荐大家搭建自己的博客,自己手痒也搭建了一个个人博客lumang,具体过程就是一开始上网搜索一番教程,按照教程开始搭建,由于是windows的环境,同时教程也有很多的老旧 ...
- css 实现文字自动换行切同行元素高度自适应
1.实现div行内布局所有行跟随最大高度自适应 html代码样例: <div class="row-single"> <div class="colsp ...
- PAT1055:The World's Richest
1055. The World's Richest (25) 时间限制 400 ms 内存限制 128000 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue ...
- urllib使用
1.基本方法 urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=Fals ...
- Linux系统根目录各文件夹的含义
centos7文件结构截图如下: 首先,我要说明我在安装centos系统的过程中,勾选了GNOME的图形界面,功能当中勾选了办公工具和开发工具,办公工具就是类似于微软的office,现在在微软offi ...
- 十九、Hadoop学记笔记————Hbase和MapReduce
概要: hadoop和hbase导入环境变量: 要运行Hbase中自带的MapReduce程序,需要运行如下指令,可在官网中找到: 如果遇到如下问题,则说明Hadoop的MapReduce没有权限访问 ...
- SOA专题---Dropwizard与Spring Boot比较
在这篇文章中我们将讨论的Java轻量级框架Dropwizard和Spring Boot的相似性和差异. 首先,这是一个选择自由和速度需要,无论你在Dropwizard和Spring Boot选择哪个, ...
- spring security4.2.2的maven配置+spring-security配置详解+java源码+数据库设计
最近项目需要添加权限拦截,经讨论决定采用spring security4.2.2!废话少说直接上干货! 若有不正之处,请谅解和批评指正,不胜感激!!!!! spring security 4.2.2文 ...
- 你不知道的JavaScript--Item16 for 循环和for...in 循环的那点事儿
大家都知道在JavaScript中提供了两种方式迭代对象: for 循环: for..in循环: 1.for循环 不足: 在于每次循环的时候数组的长度都要去获取: 终止条件要明确: 在for循环中,你 ...