gpt4 book ai didi

javascript - node.js promise 不会强制按顺序执行函数

转载 作者:搜寻专家 更新时间:2023-11-01 00:30:29 25 4
gpt4 key购买 nike

我想使用 promises 强制它们按顺序执行的三个函数。

函数 1 发送一个 http 请求,获取 JSON 数据并将其保存到一个文件中函数 2 循环遍历该文件并根据差异值/缺失值更新数据库函数 3 将遍历新更新的数据库并创建第二个 json 文件。

目前,函数 1 在 setInterval 为 30 分钟的情况下可以完美地独立运行。

我想在功能 1 完成后启动功能 2。然后在功能 2 完成后执行功能 3。

使用 promises 我试图将函数 2 附加到一个简单的完成日志以了解如何使用 promises 但没有取得太大成功。 for 循环日志中的项目,但我的 Finished/err 日志在我的 for 循环之前不应该发生。有什么建议吗?

function readJson() {
return new Promise(function() {
fs.readFile(__dirname + "/" + "bitSkin.json", 'utf8', function read(err, data) {
if (err) { throw err; }
var bitCon = JSON.parse(data);

for(var i=0; i<7; i++) { //bitCon.prices.length; i++) {
var price = bitCon.prices[i].price
var itemName = bitCon.prices[i].market_hash_name;
(function() {
var iNameCopy = itemName;
var priceCopy = price;
logger.info(iNameCopy);
}());
}
});
});
};

function fin() {
logger.info("Finished");
}

readJson().then(fin(), console.log("err"));

最佳答案

promise 没有神奇的力量。他们不会神奇地知道他们内部的异步代码何时完成。如果您创建一个 promise,当异步代码出错或完成时,您自己必须 resolve()reject() 它。

然后,此外,您必须将函数引用传递给 .then() 处理程序,而不是执行函数的结果。 .then(fin()) 将立即调用 fin() 并将它的返回值传递给 .then() 这不是你想要的.你想要像 .then(fin) 这样的东西。

以下是您如何解决和拒绝您创建的 promise :

function readJson() {
return new Promise(function(resolve, reject) {
fs.readFile(__dirname + "/" + "bitSkin.json", 'utf8', function read(err, data) {
if (err) { return reject(err); }
var bitCon = JSON.parse(data);

for(var i=0; i<7; i++) { //bitCon.prices.length; i++) {
var price = bitCon.prices[i].price
var itemName = bitCon.prices[i].market_hash_name;
(function() {
var iNameCopy = itemName;
var priceCopy = price;
logger.info(iNameCopy);
}());
}
resolve(bitCon);
});
});
};

而且,您可以像这样使用它:

function fin() {
logger.info("Finished");
}
readJson().then(fin, function(err) {
console.log("err", err)
});

变更摘要:

  1. 为 Promise 回调添加了 resolve、reject 参数,以便我们可以使用它们
  2. 在出现错误时调用reject(err)
  3. 异步代码完成后调用 resolve()
  4. 为两个 .then() 处理程序传递了一个函数引用。

仅供引用,在围绕异步函数创建 promise 包装器时,通常最好只包装函数本身。这使得包装器 100% 可重用,并将更多代码放入 promise 架构中,这通常会简化事情并使错误处理更容易。你可以像这样解决问题:

fs.readFilePromise = function(file, options) {
return new Promise(function(resolve, reject) {
fs.readFile(file, options, function(err, data) {
if (err) return reject(err);
resolve(data);
});
});
};

function readJson() {
return fs.readFilePromise(__dirname + "/" + "bitSkin.json", 'utf8').then(function(data) {
var bitCon = JSON.parse(data);
bitCon.prices.forEach(function(item) {
logger.info(item.market_hash_name);
});
return bitCon;
});
}

关于javascript - node.js promise 不会强制按顺序执行函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36958121/

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