【发布时间】:2016-04-22 20:52:12
【问题描述】:
我现在正在 node.js 中尝试这样的事情:
var exec = require('child_process').exec
var write = require('fs-writefile-promise')
function run() {
var myArray = [];
var execs = [];
for (var i = 1; i <= 7; i++) {
(function(cntr) {
write('file-' + i + '.txt', someString)
.then(function (filename) {
execs.push(new Promise(function(resolve, reject) {
exec('cat ' + 'file-' + cntr + '.cnf', function(error, stdout, stderr) {
console.log(cntr + ' ' + stdout);
if (stdout.search(/\bsomeString\b/) > -1) {
myArray.push(cntr);
resolve();
}
else {
resolve();
}
})
}))
})
.catch(function (err) {
console.error(err);
});
})(i);
}
return Promise.all(execs).then(function() {
return new Promise(function(resolve) {
resolve(myArray);
})
})
}
run().then(function(result) {
console.log(result);
});
如您所见,我正在创建多个运行 exec() 的 Promise,并且每个 Promise 都会在 exec() 完成时解析。
然后我正在等待Promise.all(execs) 中的每个 Promise 解决,以将 myArray 作为 Promise 返回。然而,当我最后执行 run() 函数时,它返回一个空数组。我想这与Promise.all() 有关,因为即使execs 中的一些Promises 尚未解决,它也会解决,但我不确定,这就是为什么我真的需要一些帮助。有谁知道我在哪里犯了代码错误?
非常感谢您!
#EDIT 1
var exec = require('child_process').exec
var write = require('fs-writefile-promise')
function run() {
var myArray = [];
var execs = [];
for (var i = 1; i <= 7; i++) {
(function(cntr) {
return new Promise(function(resolve, reject) {
fs.writeFile('file-' + i + '.txt', someString, (err) => {
if (err) {
reject();
}
else {
resolve();
}
});
})
.then(function (filename) {
execs.push(new Promise(function(resolve, reject) {
exec('cat ' + 'file-' + cntr + '.cnf', function(error, stdout, stderr) {
console.log(cntr + ' ' + stdout);
if (stdout.search(/\bsomeString\b/) > -1) {
myArray.push(cntr);
resolve();
}
else {
resolve();
}
})
}))
})
.catch(function (err) {
console.error(err);
});
})(i);
}
return Promise.all(execs).then(function() {
return new Promise(function(resolve) {
resolve(myArray);
})
})
}
run().then(function(result) {
console.log(result);
});
【问题讨论】:
-
代码被 promise 构造函数反模式所困扰。你需要了解异步代码是如何工作的,什么时候发生,然后再试一次。
-
您正在异步推送到
execs,并且在调用Promise.all时数组始终为空。立即将值的承诺推送到该数组。 -
@Bergi 立即推送承诺是什么意思?
-
.then()中的任何函数运行稍后,这意味着你的execs.push发生在之后Promise.all(execs),这意味着你正在做Promise.all([])有效。正如 Bergi 所说,将“写入”承诺推送到 execs 数组(实际上是整个承诺链)上。现在,您将循环中的这 7 个承诺返回到无处。
标签: javascript node.js asynchronous promise