Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/433.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
Javascript 如何在Node.js中等待回调函数调用?_Javascript_Node.js_Asynchronous_Async Await_Callback - Fatal编程技术网

Javascript 如何在Node.js中等待回调函数调用?

Javascript 如何在Node.js中等待回调函数调用?,javascript,node.js,asynchronous,async-await,callback,Javascript,Node.js,Asynchronous,Async Await,Callback,我不熟悉Node.js和Javascript,我过去常常向服务器发送请求 const retry = require('retry'); async function HandleReq() { //Some code return await SendReqToServer(); } async function SendReqToServer() { operation.attempt(async (currentAttempt) =>{ try {

我不熟悉Node.js和Javascript,我过去常常向服务器发送请求

const retry = require('retry');

async function HandleReq() {

//Some code
return await SendReqToServer();
}

async function SendReqToServer() {
 
operation.attempt(async (currentAttempt) =>{
        try {
            let resp = await axios.post("http://localhost:5000/api/", data, options);
            return resp.data;
        } catch (e) {
            if(operation.retry(e)) {throw e;}
        }
    });
}
我得到了空响应,因为
SendReqToServer
在函数传递给
操作之前返回一个承诺。尝试
解析该承诺


如何解决此问题?

返回
操作。如果函数中没有错误,则尝试将
相应数据返回
,返回
sendReqToServer()
。 目前,您只需将
响应数据
返回到
操作.trunt()
。您还需要返回
operation.trunt()


此问题的解决方案取决于
操作。尝试
。如果它返回一个承诺,您也可以在
SendReqToServer
中返回该承诺。但通常带有回调的异步函数不会返回承诺。创造你自己的承诺:

const retry = require('retry');

async function HandleReq() {

//Some code
return await SendReqToServer();
}

async function SendReqToServer() {
 
    return new Promise((resolve, reject) => {
        operation.attempt(async (currentAttempt) => {
            try {
                let resp = await axios.post("http://localhost:5000/api/", data, options);
                resolve(resp.data);
                return resp.data;
            } catch (e) {
                if(operation.retry(e)) {throw e;}
            }
        });
    });
}

SendReqToServer
不返回任何内容,这是故意的吗?
return resp.data
将数据返回到
。尝试
回调。您需要返回
操作。尝试(…)
将值返回到
SendReqToServer
@evolutionxbox
SendReqToServer
返回一个承诺。@ThomasSablik Yes,但在调用
操作后会立即解决。尝试()
-实际上不需要等待任何东西-因为基本上有一个隐式的
返回未定义在函数末尾。@ThomasSablik确实是。-OP:
SendReqToServer
解析为
未定义的
,我假设这不是故意的,如果
操作。尝试
不返回承诺?这行不通。非常感谢您的回复<代码>操作。尝试
不会返回承诺谢谢,这很有效,但出现上述问题是因为传递的回调函数等待axios的
承诺解决,但是操作。尝试
不会,我的理解正确吗?@AjaySabarish正确<代码>操作。调用尝试
,它几乎立即完成。回调是异步运行的。谢谢,但是你说如果
操作。尝试
返回一个承诺,我们可以返回它本身,但是我们如何确保该承诺将包含回调承诺中返回的值呢?@AjaySabarish你必须阅读文档或源代码才能看到它实际返回的内容。哦,好的,明白了,谢谢,但它不一定总是正确的,即使
操作。尝试
返回承诺?
const retry = require('retry');

async function HandleReq() {

//Some code
return await SendReqToServer();
}

async function SendReqToServer() {
 
    return new Promise((resolve, reject) => {
        operation.attempt(async (currentAttempt) => {
            try {
                let resp = await axios.post("http://localhost:5000/api/", data, options);
                resolve(resp.data);
                return resp.data;
            } catch (e) {
                if(operation.retry(e)) {throw e;}
            }
        });
    });
}