承诺使用Q nodejs

时间:2015-08-09 21:43:39

标签: promise q

我这里有这段代码,但我无法弄清楚为什么第二个FS.readfile()最后执行。基本上我想:

readFile(passwd)
  .then(console(textpasswd)
  .then(readFile(hosts).
  .then(console(texthosts);

但是发生的事情是readFile(hosts)在链中最后执行。我觉得我的推迟有问题,但是什么?

这是代码

module.paths.push('/usr/local/lib/node_modules');
var Q = require('q');
var FS=require('fs');
var deferred = Q.defer();
var p=deferred.promise;
FS.readFile("/etc/passwd", "utf-8", function (error, text) {
    if (error) {
        deferred.reject(new Error(error));
    } else {
        deferred.resolve(text);
    }
});
p.then(function (text) {
    console.log(text);
}).then(FS.readFile("/etc/hosts", "utf-8", function (error, text) {
        if (error) {
            deferred.reject(new Error(error));
        } else {
            deferred.resolve(text);
        }
    })
).then(function (text) {
    console.log(text);
});

1 个答案:

答案 0 :(得分:2)

延期必须获得新的承诺才能正确地继续链。还要注意第一个(function())()必须执行才能返回一个promise,尽管你不需要这样做。所以这是我的解决方案。 (我把它清理了一下):

module.paths.push('/usr/local/lib/node_modules');
var Q = require('q');
var FS = require('fs');
(function () {
    var deferred = Q.defer();
    FS.readFile("/etc/passwd", "utf-8", function (error, text) {
        if (error) {
            deferred.reject(new Error(error));
        } else {
            deferred.resolve(text);
        }
    })
    return deferred.promise;
})().then(function (text) {
    console.log(text);
}).then(function () {
    var deferred = Q.defer();
    FS.readFile("/etc/hosts", "utf-8", function (error, text) {
        if (error) {
            deferred.reject(new Error(error));
        } else {
            deferred.resolve(text);
        }
    })
    return deferred.promise;
}).then(function (text) {
    console.log(text);
}).then(function () {
    console.log('The End');
});