我不确定 node.js 是如何实现异步的,哪些不是异步函数,以及如何创建自定义异步函数。
假设我想创建一个自定义异步函数。如果仅仅因为我将我的最后一个参数调用到异步函数回调或 cb 中,我会感到惊讶,它只会知道它是一个异步函数:
function f(arg1, callback){
//do stuff with arg1
arg1.doStuff()
//call callback
callback(null, arg1.result());
}
我尝试了类似的方法,但它不能异步工作。如何告诉 node.js f 实际上是异步的?
最佳答案
注意:这个答案写于 2014 年,在 async function
存在之前,并且在 Promises 流行之前。虽然同样的原则也适用,但我建议您先阅读 Promises,然后再尝试了解它们与“传统”回调驱动的异步函数之间的关系。
要创建一个异步调用其回调的函数,您必须在其上使用一些平台提供的异步原语(通常与 IO 相关) - 计时器、从文件系统读取、发出请求等。
例如,这个函数接受一个回调参数,并在 100 毫秒后调用它:
function asyncFn(callback) {
setTimeout(() => {
callback();
}, 100);
}
在不需要时使函数异步的一个可能原因是为了 API 的一致性。例如,假设您有一个函数发出网络请求,并缓存结果以供以后调用:
var cache = null;
function makeRequest(callback) {
if (!cache) {
makeAjax(result => {
cache = result;
callback(result);
});
} else {
callback(cache);
}
}
问题是,这个函数是不一致的:有时是异步的,有时不是。假设您有这样的消费者:
makeRequest(result => doSomethingWithResult(result));
doSomethingElse();
doSomethingElse
函数可以在 doSomethingWithResult
函数之前或之后运行,具体取决于结果是否被缓存。现在,如果您在 makeRequest
函数上使用异步原语,例如 process.nextTick
:
var cache = null;
function makeRequest(callback) {
if(!cache) {
makeAjax(result => {
cache = result;
callback(result);
});
} else {
process.nextTick(() => callback(cache));
}
}
调用总是异步的,doSomethingElse
总是在doSomethingWithResult
之前运行。
关于javascript - 如何在 node.js 中创建自定义异步函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22286887/