如果我需要按顺序调用3个http API,那么对于以下代码来说,这将是一个更好的替代方法:
http.get({ host: 'www.example.com', path: '/api_1.php' }, function(res) {
res.on('data', function(d) {
http.get({ host: 'www.example.com', path: '/api_2.php' }, function(res) {
res.on('data', function(d) {
http.get({ host: 'www.example.com', path: '/api_3.php' }, function(res) {
res.on('data', function(d) {
});
});
}
});
});
}
});
});
}
Run Code Online (Sandbox Code Playgroud) 是否可以从node.js中的stdin同步读取?因为我正在用JavaScript编写一个关于JavaScript编译器的脑筋(只是为了好玩).Brainfuck支持需要同步实现的读取操作.
我试过这个:
const fs = require('fs');
var c = fs.readSync(0,1,null,'utf-8');
console.log('character: '+c+' ('+c.charCodeAt(0)+')');
Run Code Online (Sandbox Code Playgroud)
但这只产生这个输出:
fs:189
var r = binding.read(fd, buffer, offset, length, position);
^
Error: EAGAIN, Resource temporarily unavailable
at Object.readSync (fs:189:19)
at Object.<anonymous> (/home/.../stdin.js:3:12)
at Module._compile (module:426:23)
at Module._loadScriptSync (module:436:8)
at Module.loadSync (module:306:10)
at Object.runMain (module:490:22)
at node.js:254:10
Run Code Online (Sandbox Code Playgroud) 我如何使Node.js中的'request'模块以同步方式加载?我看到的最好的建议是以某种方式使用回调来使函数在完成之前不返回自身.我试图在代码中内联使用'request'函数(需要根据无法放在回调中的数据处理事物).
那么我怎么能使用'request'模块的回调来阻止它自己返回,直到它完成加载资源?
我正在做的是运行一个从API下载两个值的循环,然后根据这些值进行一些数学运算.虽然数学可以在回调中完成......循环将在没有执行下一个操作所需的值的情况下前进.(因此,阻止循环前进直到数据准备就绪可以解决问题)
/* loop */ {
/* URL Generation */
request( {url: base + u_ext}, function( err, res, body ) {
var split1 = body.split("\n");
var split2 = split1[1].split(", ");
ucomp = split2[1];
});
request( {url: base + v_ext}, function( err, res, body ) {
var split1 = body.split("\n");
var split2 = split1[1].split(", ");
vcomp = split2[1];
});
/* math which needs to be after functions get variables and before loop advances */
}
Run Code Online (Sandbox Code Playgroud) 我有一个不是 Web应用程序的节点应用程序 - 它在返回之前完成一系列异步任务1.在返回之前,程序的结果立即打印到控制台.
如何在返回之前确保完成所有异步工作?通过确保我们在调用res.end()之前完成的所有任务,我能够在Web应用程序中实现类似的功能,但在让脚本返回之前,我没有任何等效的最终"事件".
请参阅下面的我当前的(损坏的)功能,试图等到callStack为空.我刚刚发现这是一种无意义的方法,因为node在进入processObjWithRef中调用的任何异步函数之前等待processHub完成.
function processHub(hubFileContents){
var callStack = [];
var myNewObj = {};
processObjWithRef(samplePayload, myNewObj, callStack);
while(callStack.length>0){
//do nothing
}
return 1
}
Run Code Online (Sandbox Code Playgroud)
注意:我曾多次尝试使用async之类的库来实现这种行为(请参阅我的相关问题如何在nodejs中同步调用此请求?)所以请在建议之前考虑答案和注释答案基于'只是使用asynch'.