gpt4 book ai didi

javascript - 如何在 Node.js 中编写自定义异步函数

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

我是 javascript 的新手,想了解异步函数调用。这是我的 js 程序:

var notify =  function () {
console.log('before');
doPost('data', (res) => {
console.log('callback received');
});
console.log('after');
}
var doPost = function (data) {
console.log(data);
while (true) {
//do nothing
}
}
notify();

如果我的理解是正确的,notify()-->doPost() 是异步方式,因此'after'应该紧接在'before'之后打印。但那不会发生。我的程序等待无限循环先完成。我知道我的理解有一些漏洞。请帮忙。

我尝试了以下两个程序:这再次显示同步行为。打印:-前数据

 var notify = function () {
console.log('before');
doPost('data').then((res) => {
console.log('callback received');
});
console.log('after');

}
var doPost = function (data) {
console.log(data);
return new Promise((resolve, reject) => {
resolve('resolved');
while (true) {
//do nothing
}
});
};
notify();

但是,如果我只是删除无限运行的 while 循环,它就会开始显示异步行为。打印:-前数据后收到回调

var notify = function () {
console.log('before');
doPost('data').then((res) => {
console.log('callback received');
});
console.log('after');

}
var doPost = function (data) {
console.log(data);
return new Promise((resolve, reject) => {
resolve('resolved');
while (false) {
//do nothing
}

});
};
notify();

这超出了我的理解范围。任何帮助将不胜感激。

最佳答案

使用回调或 promise 并不一定意味着某些东西是异步的。举个例子:

   console.log("before");
[1, 2, 3].forEach(console.log);
console.log("after");

这将按顺序记录所有内容,因为 .forEach 同步调用回调。但是,也有异步回调,例如setTimeout:

 console.log("before");
setTimeout(function later() {
console.log("later");
}, 0);
console.log("after");

在这里您将看到“之前”、“之后”、“之后”,因为 later 函数在计时器完成时异步执行。要获得异步行为,您需要一个“异步根回调”,所有基于异步事物的回调/ promise 也是异步的。在 Javascript 中只有少数这样的“异步根”,即 setTimeoutsetIntervalfetch 和浏览器上的 DOM 事件处理程序或所有nodejs 上的 IO。在您的代码中没有这些,因此无论您做什么,它都是完全同步的。

要使其行为异步,请添加一个异步回调:

function notify() { // function declarations look so much better than function expressions, and they are easier to handle
console.log('before');
doPost('data', (res) => {
console.log('callback received');
});
console.log('after');
}

function doPost(data, callback) { // you pass a callback, so you should take it here
console.log(data);
setTimeout(callback, 1, "result"); // call back asynchronously
}

notify();

哦,while(true) 通常表示您犯了严重错误。

关于javascript - 如何在 Node.js 中编写自定义异步函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53681408/

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