如何在连接完成后才能执行承诺?
#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
答案 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);