var mongodb = require('./db');
var Promise = require("bluebird");
Promise.promisifyAll(mongodb);
Account.prototype.save = function save(callback){
    var account = {
        user: this.name,
        number: this.number,
        type: this.type,
        time: this.time,
    }
    mongodb.openAsync()
        .then(function(db){
            Promise.promisifyAll(db);
            db.collectionAsync('accounts')
                .then(function(collection){
                    collection.ensureIndex('user');
                    Promise.promisifyAll(collection);
                    collection.insertAsync(account,{safe:true})
                        .then(function(account){
                            mongodb.close();
                            return callback(null,account);
                        })
                        .catch(function(err){
                            mongodb.close();
                            return callback(err,null);
                        });
                })
                .catch(function(err){
                    mongodb.close();
                    return callback(err);
                });
        })
        .catch(function(err){
            return callback(err);
        });
}
这种情况下,要怎么优化一下。求大神指导!!
https://cnodejs.org/topic/560dbc826a1ed28204a1e7de
优化方案
mongoose上的static和method上扩展,别暴漏太多细节在控制层 面向promise,保证每个操作都是一个函数,让流程可以组装,不要忘了最初then的初衷
function find_user() {
    return User.findByIdAsync(user_id);
}
function find_user2() {
    return User.findByIdAsync(user_id);
}
function error(ex){
  console.log(ex);
}
TeamPartner.updateByXXAsync(a,b,c).then(find_user).then(find_user2).catch(error)
function1(){
	return xxx.f1Async();
}
function2(data){
	return yyy.f2Async();
}
xxxAsync().then(funtion1).then(function2)
这样的形式function2的参数data是否能由function1返回得到。我这边写了却获取到了undefined
@youngdeer xxx.f1Async()的结果就是,function2的参数
function getCollection(db){
    return db.collectionAsync('accounts');
}
mongodb.openAsync()
        .then(function(db){
            Promise.promisifyAll(db);
            getCollection(db);
        })
        .then(function(collection){
            console.log(collection);
		}
我的代码是这样子的,到获取collection的时候,就获取到undefined了,能帮忙指导一下么。
mongodb.openAsync()
        .then(function(db){
            Promise.promisifyAll(db);
            return db.collectionAsync('accounts');
        })
        .then(function(collection){
            console.log(collection);
        }
这样子就是没有问题的,有点疑惑。。。。。
var getCollection = function(db){
    Promise.promisifyAll(db);
    return db.collectionAsync('accounts');
}
mongodb.openAsync()
        .then(getCollection)
        .then(function(collection){
            collection.ensureIndex('user');
            Promise.promisifyAll(collection);
            return collection.insertAsync(account,{safe:true});
        })
解决了,突然想起来then里面一定是一个promise的值,就是有一点还有些不太好用,如果function2里还要用到返回值以外的参数,感觉只能放全局变量,不然提取不到外边去,就比如我代码里的
.then(function(collection){
            collection.ensureIndex('user');
            Promise.promisifyAll(collection);
            return collection.insertAsync(account,{safe:true});
        })
这里的account的值,若要把这个then里的promise值提取到外边去,只能定义全局变量么。
var mongodb = require('./db');
var Promise = require("bluebird");
Promise.promisifyAll(mongodb);
Account.prototype.save = function save(callback){
    var account = {
        user: this.name,
        number: this.number,
        type: this.type,
        time: this.time,
    }
    var getCollection = function(db){
        Promise.promisifyAll(db);
        return db.collectionAsync('accounts');
    }
    var collectionInsert = function(collection){
        collection.ensureIndex('user');
        Promise.promisifyAll(collection);
        return collection.insertAsync(account,{safe:true});
    }
    var saveSuccess = function(){
        mongodb.close();
        return callback();
    }
    var saveFail = function(err){
        mongodb.close();
        return callback(err);
    }
    mongodb.openAsync()
        .then(getCollection)
        .then(collectionInsert)
        .then(saveSuccess)
        .catch(saveFail);
}
在您的指导下,代码最终优化成了这样,请问是否还可以有改进的地方=。=!!!
@youngdeer 换mongoose吧
看着这么多 Promise.promisifyAll,感觉好辛苦。
我看 bluebird 的文档,应该是可以在 prototype 的层面上进行一次性 Promise.promisifyAll 的。
var App = function () {
	this.name = '';
	this.sex = '男';
	
	this.init();
};
App.prototype = {
	init: function () { //程序入口
		console.log('初始化');
		this.writeName();
	},
	writeName: function () { //输出姓名
		console.log(this.name);
		this.writeSex();
	},
	writeSex: function () { //输出性别
		console.log(this.sex);
	}
};
new App(); //启动程序
可以尝试下我这种写法试试,能解决层层嵌套的问题,模块化开发