gpt4 book ai didi

javascript - 如何使用非常规方法从 NodeJS 中的异步函数传递数据?

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

我一直在玩 jsdom,它是 node.js 的一个模块。底部的以下代码来自他们的文档页面。我的问题是如何从异步函数返回一些东西。

我知道这是一个经常被问到的问题,可能我也是。我也知道回调是解决这类问题的好 friend 。我的目标是找到一种解决方法,它可能像 PHP 中的 cookie 或 Session 变量一样,以便将那一点数据传输到异步函数之外的外部范围。然后,一旦从外部范围设置了数据,它就应该可以访问了。

首先我想知道的是:

  1. 是否已经有一种方法可以将数据存储在诸如 cookie 或 session 之类的地方,存在于外部范围,并且在我完成我必须做的事情后可以访问?
  2. 如果我要将数据写入文件,即代码中的 B 点,并在 C 点读取数据,难道我不必编写一个在读取文件之前等待几秒钟的某种超时功能?我在 nodejs 中使用异步函数的经验有时表明,在尝试读取它之前,我必须等待几秒钟才能完成写入过程。这里也会这样吗?如果是,是否意味着如果我保存数据的地方是内存,这是否会发生?
  3. 如果我为此目的编写一个 C++ 插件,它充当一个单独的数据区,我们可以在 B< 处保存(数据)/strong> 到内存,并从内存中 retrieve(data)C;这行得通吗?

老实说,我不喜欢编写临时文件来绕过异步函数。我一直在寻找一种简单而有效的方法来传递数据,但我需要像您这样经验丰富的程序员的一些指导,以超越不必要的方法来解决这个问题。

如果您能为我提供一些想法,说明哪些可行,哪些不可行,我将不胜感激。

示例代码如下:

// Print all of the news items on hackernews
var jsdom = require("jsdom");
// var result;
// A) Outer Scope: Since the function is async in done, storing the result here and echoing in point C is pointless.
jsdom.env({
html: "http://news.ycombinator.com/",
scripts: ["http://code.jquery.com/jquery.js"],
done: function (errors, window) {
var $ = window.$;
console.log("HN Links");
$("td.title:not(:last) a").each(function() {
console.log(" -", $(this).text());
});
// B) let's say I want to return something I've scavenged here.
// result = $("a");
}
});
// C)
// console.log(result)

最佳答案

您需要清除您的同步体验,即认为文件中较低的代码会及时发生。它不一定在 Node 中这样做,永远。这是交易。在 node 中,您可以像在餐厅一样下订单,而不是像这样:

1. Order a salad
2. Wait 11 minutes
3. Eat the salad

你这样做

1. Order a salad
2. Wait for the server to serve you the salad
3. Eat the salad

第一个例子是竞争条件和程序中的一个可怕错误,它会导致等待的沙拉无缘无故被吃掉,或者试图吃还没有的沙拉。

不要想着“我要在这里返回一些东西”,想着“这个数据已经准备好了”。所以你可以:

function eatSalad() {...}
placeOrder("salad", eatSalad);

其中 eatSaladplaceOrder 例程的回调,它执行必要的 I/O 以获得沙拉。请注意,尽管 eatSalad 在文件中较早,但它按时间顺序发生在较晚的位置。您不返回任何东西,您使用准备好的数据调用回调。

这是您的异步​​代码段。

// Print all of the news items on hackernews
var jsdom = require("jsdom");
// var result;
// A) Outer Scope: Since the function is async in done, storing the result here and echoing in point C is pointless.
jsdom.env({
html: "http://news.ycombinator.com/",
scripts: ["http://code.jquery.com/jquery.js"],
done: function (errors, window) {
var $ = window.$;
console.log("HN Links");
$("td.title:not(:last) a").each(function() {
console.log(" -", $(this).text());
});
// B) let's say I want to return something I've scavenged here.
// result = $("a");
resultIsReady($("a"));
}
});

function resultIsReady(element) {
console.log(element);
}

EDIT TO ADD 从评论中回答你的问题, Node 代码通常不是从返回东西的函数构建的,而是从调用带有“返回值”的回调函数的函数构建的。 return 关键字仅用于实际返回不执行任何 I/O 的内存中代码的值。所以求内存数组的均值直接返回即可,而求数据库结果集的均值必须调用回调函数。基本范例是从这样的函数(伪代码数据库库)构建你的程序:

function getUser(email, callback) {
db.users.where({email: email}, function (error, user) {
if (error) {
//This return statement is just for early termination
//of the function. The value returned is discarded
return callback(error);
}
callback(null, user);
});;
}

这就是你做事的方式。通常像这样的函数执行的 IO 调用数量非常有限(1 或 2 个很常见,然后您开始陷入嵌套 hell 并需要重构)。

我个人编写了很多这样的函数,然后使用 async库来描述需要发生的事情的高阶序列。还有很多其他流行的流程控制库,有些人喜欢 promise 模式。然而,目前一些核心 Node 社区成员似乎正在提倡回调作为唯一真正的方式,而 promises 似乎正在失宠。

关于javascript - 如何使用非常规方法从 NodeJS 中的异步函数传递数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16756878/

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