Javascript 如何在Node.js中等待回调函数调用?
我不熟悉Node.js和Javascript,我过去常常向服务器发送请求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 {
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
@evolutionxboxSendReqToServer
返回一个承诺。@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;}
}
});
});
}