我们说我有一个包含某些承诺的文件,按顺序执行时,准备一个输入文件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初学者在这里;如果我的方法完全没有意义,请事先道歉...... :)
答案 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
});