Node.js 等待回调
我正在使用回调来提高我的程序的效率。我想等待我的'a'变量从回调中获取值,如果它在某个时候还没有。我的代码如下所示:Node.js 等待回调,node.js,callback,Node.js,Callback,我正在使用回调来提高我的程序的效率。我想等待我的'a'变量从回调中获取值,如果它在某个时候还没有。我的代码如下所示: function myFunction(callback){ request("url", function(error, response, body) { if (!error && response.statusCode == 200) { result = JSON.stringify(JS
function myFunction(callback){
request("url", function(error, response, body) {
if (!error && response.statusCode == 200)
{
result = JSON.stringify(JSON.parse(body));
return callback(null, result);
}
else
{
return callback(error, null);
}
});
}
var a = myFunction(function(err, data){
if(!err)
{
return(data);
}
else
{
return(err);
}
});
//A CHUNK OF CODE EXECUTES HERE
//I'D LIKE TO CHECK IF THE a VARIABLE GOT THE VALUE (if the callback was executed), note that I don't want to nest the chunk inside the callback, but rather I'd like to check that outside function callback via IF statement/loop or some similar alternative
//MORE CODE CONNECTED TO THE CALLBACK
如果在执行代码块时变量还没有得到值,那么如何等待变量得到值呢?我知道使用回调的唯一目的是不等待,但在这种情况下,这对我来说是必要的,所以请不要烦人:)我建议尝试使用async/wait和模块,这使语法非常简单。如果调用因某种原因失败,将抛出错误,这很容易捕获: 例如:
const rp = require('request-promise-native');
async function testAsyncRequest() {
try {
let promise = rp('https://my-json-server.typicode.com/typicode/demo/posts');
// Do some stuff here...
let result = await promise;
console.log("Result: ", result);
} catch (err) {
console.error(`Something went wrong: ${err.message}`);
}
}
testAsyncRequest();
因此,我最终做出了一点妥协(不得不嵌套),但代码按预期工作:
var something;
function myFunction(callback){
request("url", function(error, response, body) {
if (!error && response.statusCode == 200)
{
result = JSON.stringify(JSON.parse(body));
return callback(null, result);
}
else
{
return callback(error, null);
}
});
}
var a = myFunction(function(err, data){
if(!err)
{
something = data;
return(data);
}
else
{
return(err);
}
});
//A CHUNK OF CODE EXECUTES HERE
var something_cachedValue=something;
doStuff();
function doStuff() {
if(something===something_cachedValue) {
setTimeout(doStuff, 10);
return;
}
something_cachedValue = something;
//MORE CODE CONNECTED TO THE CALLBACK
}
所以基本上我是通过重新调用函数来检查回调是否每10毫秒完成一次。完成后,将执行“//更多连接到回调的代码”。这不是最干净、最花哨的方法,但它确实起到了作用。你应该使用承诺。
返回回调(null,result)
不会做你认为它在那种情况下会做的事情。return语句只适用于匿名函数,myFunction
没有return
语句,因此它总是返回undefined
/await@Paulpro是的,我注意到了,但这没有问题,因为我可以在返回之前将数据存储到另一个变量中。我的目标是确保我知道回调是什么时候发生的executed@quo91回调的全部目的是在请求完成后运行代码。您可以将需要在请求之后运行的所有代码放入回调中,包括调用其他函数。你放在外面的所有代码(你有“一块代码在这里执行”)都保证在回调之前运行。是的,这确实有效,但不是我想要的方式。我的意图是启动函数,然后执行代码块(无需等待)。在该块完成后,我将检查/等待该请求是否完成并处理该信息。我希望这样可以缩短执行代码所需的时间。啊,是的,我明白了,请记住异步函数不会阻塞,因此它会快速执行。一旦结果可用,将立即填充结果。它实际上只是一个回调,但语法更简单。@quo91我想您可以使用它的一个变体来做您想做的事情。它看起来像是letrequestpromise=rp(“url”);//在这里等之前先做些事情;让结果=等待请求承诺;//在这里对回复进行处理
我已根据@Paulpros的评论进行了更新,在等待承诺解决的同时,您可以运行任何您喜欢的操作。您还可以在异步函数退出后运行一些代码。它可能会在请求返回之前完成。