Javascript 为什么这些.then()出现了问题?
我有一个节点应用程序,Javascript 为什么这些.then()出现了问题?,javascript,node.js,es6-promise,Javascript,Node.js,Es6 Promise,我有一个节点应用程序,spawns achild\u进程。当child\u进程运行完毕后,我想解决一个问题。以下代码可以工作,但.then()语句出现的顺序不正确: const storage = require('./storage'); const logging = require('./logging'); const process = require('child_process').spawn; function convertIncomingFile(pathToFile)
spawn
s achild\u进程
。当child\u进程
运行完毕后,我想解决一个问题。以下代码可以工作,但.then()
语句出现的顺序不正确:
const storage = require('./storage');
const logging = require('./logging');
const process = require('child_process').spawn;
function convertIncomingFile(pathToFile) {
logging.info(`Converting ${pathToFile}`);
const convert = process(`cat`, [pathToFile], {});
return Promise.resolve(
convert.stdout.on('data', (data) => {
logging.info(data.toString('utf8'));
}),
convert.stderr.on('data', (err) => {
logging.error(err);
}),
convert.on('close', (code) => {
logging.info(`Conversion finished with status code ${code}`);
})
);
}
module.exports = {
convertFile: (filename) => {
storage.downloadFile(filename).
then((localFilename) => {
logging.info(`File saved to: ${localFilename}`);
}).
then(() => convertIncomingFile(`./files/${filename}`)).
then(() => {
logging.info(`Coversion of ${filename} complete.`);
}).
catch((apiErr) => {
logging.error(apiErr);
});
}
};
我得到的结果是:
info: File saved to: ./files/package.json
info: Converting ./files/package.json
info: Coversion of package.json complete.
info: {
<file contents>
}
info: Conversion finished with status code 0
info:文件保存到:./files/package.json
信息:正在转换./files/package.json
信息:package.json的转换已完成。
信息:{
}
信息:转换已完成,状态代码为0
如您所见,package.json的
转换已完成。
语句出现在记录文件内容和转换状态代码语句之前。为什么会出现这种情况?如何使“转换完成”语句出现在“状态代码”语句之后?您必须将转换文件
进一步传递,以便让next知道它必须等待:
then(() => {
return convertFile(`./files/${filename}`);
})
和更短的等效值:
then(() => convertFile(`./files/${filename}`))
您必须进一步传递convertFile
承诺,让next知道它必须等待:
then(() => {
return convertFile(`./files/${filename}`);
})
和更短的等效值:
then(() => convertFile(`./files/${filename}`))
Promise.resolve
意味着返回您给定的已解决值,它并不像您期望的那样真正异步。查看和以了解更多详细信息
函数转换输入文件(路径文件){
info(`Converting${pathToFile}`);
const convert=process(`cat`,[pathToFile],{});
返回新承诺((解决、拒绝)=>{
convert.stdout.on('data',(data)=>{
logging.info(data.toString('utf8'));
}),
convert.stderr.on('data',(err)=>{
记录错误(err);
拒绝
}),
convert.on('关闭',(代码)=>{
logging.info(`Conversion finished with status code${code}`);
解决()
})
})
}
承诺。解析
意味着返回您给定的已解析值,它并不像您期望的那样真正异步。查看和以了解更多详细信息
函数转换输入文件(路径文件){
info(`Converting${pathToFile}`);
const convert=process(`cat`,[pathToFile],{});
返回新承诺((解决、拒绝)=>{
convert.stdout.on('data',(data)=>{
logging.info(data.toString('utf8'));
}),
convert.stderr.on('data',(err)=>{
记录错误(err);
拒绝
}),
convert.on('关闭',(代码)=>{
logging.info(`Conversion finished with status code${code}`);
解决()
})
})
}
我不确定其中一些应该返回什么,但我没有看到任何返回
语句看起来像是返回承诺…除了返回承诺。解析(…)
?WTF?您正在将三个参数传递给Promise.resolve
,而这只需要一个参数,您将无处等待事件。您需要使用newpromise
构造函数正确地承诺spawn
,就像或convertinomingfile
不会在任何地方调用一样。您的convertFile
正在调用自身。这实际上看起来像一个无限循环。而且,它不返回任何东西,因此打破了承诺链。最后,您可以通过在loggin.info之后立即返回convertFile(File saved blah blah
)来减少这一点,以减少您的然后
sSorry中的一个,这是一个打字错误。它不调用自身。我不确定其中一些应该返回什么,但我没有看到任何return
语句看起来像是返回承诺…除了return promise.resolve(…)
?WTF?您正在将三个参数传递给Promise.resolve
,而这只需要一个参数,您将无处等待事件。您需要使用newpromise
构造函数正确地承诺spawn
,就像或convertinomingfile
不会在任何地方调用一样。您的convertFile
正在调用自身。这实际上看起来像一个无限循环。而且,它不返回任何东西,因此打破了承诺链。最后,您可以通过在loggin.info之后立即返回convertFile(File saved blah blah
)来减少这一点,以减少您的然后
sSorry中的一个,这是一个打字错误。它不称自己。嗯,这似乎给出了相同的结果。我已经更新了返回convertFile
的代码。我想你是想把它改成convertinomingfile。对了,已经修复了。嗯,这似乎给出了相同的结果。我已经更新了返回convertFile
的代码。我想你是想把它改成convertIncomingFile。没错,已经修复了。