Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么这些.then()出现了问题?_Javascript_Node.js_Es6 Promise - Fatal编程技术网

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 a
child\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。没错,已经修复了。