仅在某些承诺解决后才导入/导出

时间:2016-07-11 15:00:04

标签: javascript node.js promise

我们说我有一个包含某些承诺的文件,按顺序执行时,准备一个输入文件input.txt



// prepareInput.js

var step1 = function() {
    var promise = new Promise(function(resolve, reject) {
        ...
    });
    return promise;
};
              
var step2 = function() {
    var promise = new Promise(function(resolve, reject) {
        ...
    });
    return promise;
};
              
var step3 = function() {
    var promise = new Promise(function(resolve, reject) {
        ...
    });
    return promise;
};

step1().then(step2).then(step3);

exports.fileName = "input.txt";




如果我运行node prepareInput.js,则会执行第step1().then(step2).then(step3)行并创建该文件。

如何更改此设置,以便当其他文件尝试从此模块中检索fileName时,{file}会在fileName公开之前运行并完成?step1().then(step2).then(step3);?类似的东西:



// prepareInput.js
...

exports.fileName = 
    step1().then(step2).then(step3).then(function() {
        return "input.txt";
    });


// main.js
var prepareInput = require("./prepareInput");
var inputFileName = require(prepareInput.fileName);
              




Node.js初学者在这里;如果我的方法完全没有意义,请事先道歉...... :)

1 个答案:

答案 0 :(得分:7)

您无法直接导出异步检索的结果,因为导出是同步的,因此它会在检索到任何异步结果之前发生。这里通常的解决方案是导出一个返回promise的方法。然后调用者可以调用该方法并使用该promise来获得所需的异步结果。

module.exports = function() {
    return step1().then(step2).then(step3).then(function() {
        // based on results of above three operations, 
        // return the filename here
        return ...;
    });
}

然后来电者这样做:

require('yourmodule')().then(function(filename) {
    // use filename here
});

要注意的一件事是,如果一系列事物中的任何操作是异步的,那么整个操作就变为异步,然后调用者不能同步获取结果。有些人以这种方式将异步称为“传染性”。因此,如果您的操作的任何部分是异步的,那么您必须为最终结果创建一个异步接口。

您还可以缓存承诺,因此每个应用只运行一次:

module.exports = step1().then(step2).then(step3).then(function() {
    // based on results of above three operations, 
    // return the filename here
    return ...;
});

然后来电者这样做:

require('yourmodule').then(function(filename) {
    // use filename here
});