准备就绪时执行一系列promises

时间:2017-11-15 15:12:17

标签: javascript node.js promise fs

如何在连接完成后才能执行承诺?

#standardSQL
WITH `project.dataset.yourTable` AS (
  SELECT 1 id, ";2435031;1;5.98;;eVar36=bopis|ev2=2605,;1483528;1;17.97;;ev6=bopis|evar52=2605,;1010203;1;7.98;;ev6=bopis|ev2=2605" data UNION ALL
  SELECT 2, NULL
), `project.dataset.anotherTable` AS (
  SELECT 2435034 account, 'D1' name UNION ALL
  SELECT 1483528, 'D2' UNION ALL
  SELECT 1010203, 'D3' 
)
SELECT 
  id, 
  (SELECT STRING_AGG(nbr, '|' ORDER BY pos) 
    FROM UNNEST(REGEXP_EXTRACT_ALL(
      REGEXP_REPLACE(t.data, r'[^\d]+', ','),r'[0-9]{7}')) nbr WITH OFFSET pos
    JOIN `project.dataset.anotherTable` x
      ON CAST(x.account AS STRING) = nbr
  ) a_nbr,
  (SELECT STRING_AGG(name, '|' ORDER BY pos) 
    FROM UNNEST(REGEXP_EXTRACT_ALL(
      REGEXP_REPLACE(t.data, r'[^\d]+', ','),r'[0-9]{7}')) nbr WITH OFFSET pos
    JOIN `project.dataset.anotherTable` x
      ON CAST(x.account AS STRING) = nbr
  ) a_name,
  data
FROM `project.dataset.yourTable` t
GROUP BY id, data

1 个答案:

答案 0 :(得分:1)

fs.readFile不会返回承诺。

您应该使用util.promisify来执行此操作。

此外,正如PatrickHübl-Neschkudla在下面的评论中提到的,没有必要使用async / await,因为readFile现在已经返回一个承诺而我们没有处理结果直到以后。

Bergi在评论中也指出fs.readFile回调不能保证按创建顺序返回。实际上,大多数fs操作都是这种情况,因为其他进程总是可以通过同时操作文件来干扰您的操作 - 例如,如果有人写入您要阅读的文件会怎么样?

一旦所有读取完成,您应该执行连接,而不是在它们发生时执行(因为它们可能会不同步)。

无论哪个承诺(文件读取)失败,这也将确保all rejections are properly caught

const readFile = util.promisify(fs.readFile);

Promise.all(
  files.map(e => readFile(testFolder + e, "utf8"))
)
.then(contentArray => contentArray.join('.\n'))
.then(console.log);