promise主要是用来解决异步回调问题,其实还有好几种比promise更好的方案,后面再说,这节,我们先用promise来改造下,我以前写的一篇文章[js高手之路]javascript腾讯面试题学习封装一个简易的异步队列

中的一道面试题( 页面上有一个按钮,一个ul,点击按钮的时候,每隔1秒钟向ul的后面追加一个li, 一共追加10个,li的内容从0开始计数( 0, 1, 2, ....9 ) ).

promise的小实例:

 function next1(){
return new Promise( function( resolve, reject ){
console.log( 'next1' );
resolve( 'jump to next2' );
} );
} function next2(){
return new Promise( function( resolve, reject ){
console.log( 'next2' );
resolve( 'jump to next3' );
} );
} next1().then( function( res ){
console.log( res );
return next2();
} ).then( function( res ){
console.log( res );
} );

使用promise的改造方案:

 <input type="button" value="添加">
<ul></ul>
<script>
var oUl = document.querySelector("ul");
var oBtn = document.querySelector("input");
var count = 0;
var timer = null;
function createDom() {
var oLi = document.createElement("li");
oLi.innerHTML = count++;
oUl.appendChild(oLi);
}
var addDom = (function () {
return new Promise(function (resolve, reject) {
resolve(createDom);
});
})();
oBtn.onclick = function () {
timer = setInterval(function () {
if (count == 10) {
clearInterval(timer);
} else {
addDom.then(function (fn) {
fn();
});
}
}, 1000);
}
</script>

接下来,我们就用promise结合Node.js+jade+mongodb+mongoose+express来实现一个简单的todolist( 留言板 )

项目结构:

实现的效果:

public: 存放的项目的静态资源,如图片,css,js等

routers: 把不同功能模块分离出不同的路由,如index.js( 首页路由 ), add.js( 发布留言时候的路由 )

views: jade模板目录

db.js: 数据库连接模块

server.js: 启动服务器以及项目入口

server.js:

 var express = require('express');
var app = express();
var path = require( 'path' );
var indexRouter = require( './routers/index.js' );
var addRouter = require( './routers/add.js' ); app.use( '/', indexRouter );
app.use( '/add', addRouter );
app.use( express.static( path.join( __dirname, 'public' ) ) ); app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade'); app.listen( 3000 );
console.log( 'server listening on:' + 3000 );

index.js,渲染首页,取出数据库中的所有留言数据

 var express = require('express');
var router = express.Router();
var Message = require('../db'); function getAllMsg(){
return new Promise( function( resolve, reject ){
Message.find( {}, function( err, msgList ){
resolve( msgList );
} );
} );
}
router.get('/', function (req, res) {
getAllMsg().then( function( data ){
res.render( 'index', {
msgList : data
} );
} );
});
module.exports = router;

add.js,处理发布留言的提交流程

 var express = require( 'express' );
var router = express.Router();
var Message = require( '../db' ); function addMsg( msgInfo ){
var msgModel = new Message( msgInfo );
msgModel.save(function(err,result){
if( err ){
console.log( err );
}else{
console.log( 'success' );
}
});
}
router.get('/', function( req, res ) {
addMsg( {
title : req.query.msg,
listTime : new Date()
} );
res.redirect( '/' );
}); module.exports = router;

db.js: 数据库连接模块

 var mongoose = require('mongoose');
mongoose.Promise = global.Promise;
var DB_URL = 'mongodb://localhost:27017/cms'; var db = mongoose.createConnection(DB_URL);
db.on('connected', function (err) {
if (err) {
console.log(err);
} else {
console.log('db connected success');
}
});
var Schema = mongoose.Schema;
var msgSchema = new Schema({
title: String, //留言信息
listTime: Date //发布时间
});
var Message = db.model( 'Message', msgSchema ); module.exports = Message;

后续的功能:

1,删除

2,编辑

3,分页

...等等

[js高手之路]Node.js+jade+express+mongodb+mongoose+promise实现todolist的更多相关文章

  1. [js高手之路]Node.js+jade+mongoose实战todolist(分页,ajax编辑,删除)

    该系列文章索引: [js高手之路]node js系列课程-创建简易web服务器与文件读写 [js高手之路]node js系列课程-图解express+supervisor+ejs用法 [js高手之路] ...

  2. [js高手之路]Node.js+jade抓取博客所有文章生成静态html文件

    这个周末,恶补了一下jade模板引擎,就为生成静态html文件,这篇文章需要知道jade以及看过我的上篇文章,我先给出他们的参考链接: [js高手之路]Node.js模板引擎教程-jade速学与实战1 ...

  3. [js高手之路]Node.js+jade+mongodb+mongoose实现爬虫分离入库与生成静态文件

    接着这篇文章[js高手之路]Node.js+jade抓取博客所有文章生成静态html文件继续,在这篇文章中实现了采集与静态文件的生成,在实际的采集项目中, 应该是先入库再选择性的生成静态文件.那么我选 ...

  4. [js高手之路]Node.js实现简易的爬虫-抓取博客文章列表信息

    抓取目标:就是我自己的博客:http://www.cnblogs.com/ghostwu/ 需要实现的功能: 抓取文章标题,超链接,文章摘要,发布时间 需要用到的库: node.js自带的http库 ...

  5. [js高手之路]Node.js实现简易的爬虫-抓取博客所有文章列表信息

    抓取目标:就是我自己的博客:http://www.cnblogs.com/ghostwu/ 需要实现的功能: 抓取博客所有的文章标题,超链接,文章摘要,发布时间 需要用到的库: node.js自带的h ...

  6. [js高手之路]node js系列课程-图解express+supervisor+ejs用法

    上文通过node js自带的http模块搭建了一个简易的服务器,实际在开发中,一般用的是express框架,本文我们就来讲讲项目开发中必备不可少的几样东西: 服务器( express ) 路由( ex ...

  7. [js高手之路]Node.js模板引擎教程-jade速学与实战2-流程控制,转义与非转义

    一.转义与非转义 jade模板文件代码: doctype html html head meta(charset='utf-8') title jade学习-by ghostwu body h3 转义 ...

  8. [js高手之路]node js系列课程-创建简易web服务器与文件读写

    web服务器至少有以下几个特点: 1.24小时不停止的工作,也就是说这个进程要常驻在内存中 2.24小时在某一端口监听,如: http://localhost:8080, www服务器默认端口80 3 ...

  9. [js高手之路]Node.js模板引擎教程-jade速学与实战4-模板引用,继承,插件使用

    一.block 模块复用 把需要复用的模块用block定义 block后面跟上模块的名字,引用一次block 内容就会被复用一次 编译之后的结果: 二,继承模板(extends) 在实际开发中,网站的 ...

随机推荐

  1. 第9天:CSS精灵图

    今天重点学习了CSS精灵图. "CSS精灵",英语css sprite,所以也叫做"CSS雪碧"技术.是一种CSS图像合并技术,该方法是将小图标和背景图像合并到 ...

  2. JSON以及Java转换JSON的方法(前后端常用处理方法)

    )); map.put("arr", new String[] { "a", "b" }); map.put("func" ...

  3. SQL练习题完整(做完你就是高手)

    SQL 练习题答案 一.补充作业一.   设有三个关系:                S(SNO, SNAME, AGE, SEX,Sdept)                SC(SNO, CNO ...

  4. 【Ubuntu 16】网络配置文件

    之前使用图形化NetworkManager配置静态IP,但在/etc/network/interfaces中找不到静态IP的配置信息,让人不解. 今天在网上看到网友的一则文章,知道了在/etc/Net ...

  5. JavaScript 学习笔记 - LocalStorage

    前言 本文主要介绍本地存储的基本使用,以及它和 Cookie.SessionStorage 的区别. 简单回顾 Cookie 在 HTML5 之前,本地存储数据一般是通过 Cookie 来完成的.我们 ...

  6. c# 后台get post请求

    //get请求 public static TResult Get<TResult>(string host, string url) { var httpClient = new Htt ...

  7. Andrew Ng机器学习课程笔记--week7(SVM)

    本周主要学习SVM 一. 内容概要 Large Margin Classification Optimization Objective(优化Objective(损失函数)) Large Margin ...

  8. 采用OCR识别自动识别财务报表

    一.         财务报表有什么作用 财务报表又叫会计报表,包含:资产负债表.损益表.现金流量表三表.财务报表对企业经营状况有重要的参考意义: n  全面系统地揭示企业一定时期的财务状况.经营成果 ...

  9. python+selenium自动化软件测试(第5章):Selenium Gird

    5.1 分布式(Grid) Selenium grid是用来分布式执行测试用例脚本的工具,比如测试人员经常要测试多浏览器的兼容性,那就可以用到grid了.下面就来介绍如何在多个浏览器上运行同一份脚本. ...

  10. 6.分析request_irq和free_irq函数如何注册注销中断

    上一节讲了如何实现运行中断,这些都是系统给做好的,当我们想自己写个中断处理程序,去执行自己的代码,就需要写irq_desc->action->handler,然后通过request_irq ...