将回调函数转换成promise(粗糙版)

var q = require("q");
function Q(outerFunc) {

    return function () {
        // 避免上下文丢失
        var context = this;
        var args = [];
        for (var i in arguments) {
            args.push(arguments[i]);
        }

        var deferred = q.defer();

        args.push(function () {
            if (arguments[0] != null) {
                deferred.reject(arguments[0]);
            } else {
                var returnedData = [];
                //  (null, value1, value2,...).回调函数里如果返回多个data,先处理成数组
                for (var i in arguments) {
                    if (i == 0)
                        continue;
                    returnedData.push(arguments[i]);
                }
                // 将数组dereference
                deferred.resolve.apply(null, returnedData)
            }
        });

        outerFunc.apply(context, args);
        return deferred.promise;
    }

}

var fs = require("fs");

qFs = Q(fs.readFile);

qFs("../package.json")
    .then(function (data) {
        console.log(data);
    })
    .catch(function (error) {
        console.log(error);
    });

你可能感兴趣的:(将回调函数转换成promise(粗糙版))