Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 等待回调_Node.js_Callback - Fatal编程技术网

Node.js 等待回调

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

我正在使用回调来提高我的程序的效率。我想等待我的'a'变量从回调中获取值,如果它在某个时候还没有。我的代码如下所示:

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的评论进行了更新,在等待承诺解决的同时,您可以运行任何您喜欢的操作。您还可以在异步函数退出后运行一些代码。它可能会在请求返回之前完成。