gpt4 book ai didi

javascript - 使用 promise 的链接方法

转载 作者:行者123 更新时间:2023-11-30 14:55:34 27 4
gpt4 key购买 nike

我正在努力理解 promises,我想我可以看到它们如何以您可以说的方式工作 Step 1Step 2 和然后是 Step 3 例如。
我使用 node-fetch(使用原生 Promises)

创建了这个下载函数
## FileDownload.js

const fetch = require('node-fetch');
const fs = require('fs');

module.exports = function(url, target) {
fetch(url)
.then(function(res) {
var dest = fs.createWriteStream(target);
res.body.pipe(dest);
}).then(function(){
console.log(`File saved at ${target}`)
}).catch(function(err){
console.log(err)
});
}

所以这一切都按顺序执行,我可以看到它是如何工作的。

我有另一种方法可以将 CSV 文件转换为 JSON(再次使用 promise )

## CSVToJson.js

const csvjson = require('csvjson');
const fs = require('fs');
const write_file = require('../helpers/WriteToFile');

function csvToJson(csv_file, json_path) {
return new Promise(function(resolve, reject) {
fs.readFile(csv_file, function(err, data){
if (err)
reject(err);
else
var data = data.toString();
var options = {
delimiter : ',',
quote : '"'
};
const json_data = csvjson.toObject(data, options);
write_file(json_path, json_data)
resolve(data);
});
});
}

module.exports = {
csvToJson: csvToJson
}

当我一个接一个地调用这些函数时,第二个函数失败,因为第一个函数尚未完成。

我是否需要将这两个函数调用包装在另一个 promise 中,即使它们各自都实现了 promise?

如果我完全误解了这一点,请告知

最佳答案

When I call these functions one after another the second function fails as the first has not completed.

第一个有两个问题:

  1. 它不等待文件被写入;它所做的只是设置管道,无需等待过程完成
  2. 它不提供任何方式让调用者知道进程何时完成

要处理第一个问题,您必须等待目标流(pipe 返回)上的 finish 事件。要处理第二个问题,您需要返回一个 promise ,该 promise 在此之前不会实现。类似这样的内容(参见 ** 评论):

module.exports = function(url, target) {
// ** Return the end of the chain
return fetch(url)
.then(function(res) {
// ** Unfortunately, `pipe` is not Promise-enabled, so we have to resort
// to creating a promise here
return new Promise((resolve, reject) => {
var dest = fs.createWriteStream(target);
res.body.pipe(dest)
.on('finish', () => resolve()) // ** Resolve on success
.on('error', reject); // ** Reject on error
});
}).then(result => {
console.log(`File saved at ${target}`);
return result;
});
// ** Don't `catch` here, let the caller handle it
}

然后你可以对结果使用thencatch来进行下一步:

theFunctionAbove("/some/url", "some-target")
.then(() = {
// It worked, do the next thing
})
.catch(err => {
// It failed
});

(或async/await。)


旁注:我还没有对其进行代码审查,但是 csvToJson 中的一个严重问题跳了出来,也是一个小问题,@Bergi 强调了第二个问题:

  1. else 逻辑周围缺少 {}

  2. 小问题是您有 var data = data.toString();data 是该函数的参数,因此 var 具有误导性(但无害)

  3. 它没有正确处理 readFile 回调的 else 部分代码中的错误

我们可以通过在 else 中执行 resolve 并在 then 处理程序中执行其余逻辑来解决这两个问题:

function csvToJson(csv_file, json_path) {
return new Promise(function(resolve, reject) {
fs.readFile(csv_file, function(err, data){
if (err)
reject(err);
else
resolve(data);
});
})
.then(data => {
data = data.toString();
var options = {
delimiter : ',',
quote : '"'
};
const json_data = csvjson.toObject(data, options);
write_file(json_path, json_data);
return data;
});
}

关于javascript - 使用 promise 的链接方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47329177/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com