Nodejs 如何等待某个耗时操作的返回值
Nodejs 如何等待某个耗时操作的返回值
已经解决!!
18 updatePass: function(passwd) {
19 var status;
20 this.updateAttributes({passwd: passwd}).on('success', function(msg){
21 status = "success";
22 console.log(msg);
23 console.log("statusstatus:"+status);
24 return status;
25 }).on('failure', function(err){
26 status = "error";
27 console.log(err);
28 console.log("statusstatus:"+status);
29 return status;
30 });
31 }
然后在另一个文件里调用了该函数:
247 status = model.updatePass(newPasswd);
248 console.log(status);
这里我始终无法获得status的值,因为248行的打印始终是在updatePass之前完成。我该怎么办
6 回复
当然,我可以帮助你解决这个问题。在 Node.js 中处理异步操作时,通常使用回调函数、Promise 或 async/await 来管理异步逻辑。你的问题在于 updatePass
函数中的异步操作没有正确地等待其完成。
示例代码及解释
假设我们有一个数据库更新操作,需要等待其完成才能获取状态。
使用 Promise
// 定义一个返回 Promise 的函数
function updatePass(passwd) {
return new Promise((resolve, reject) => {
this.updateAttributes({ passwd: passwd })
.then(msg => {
resolve("success");
console.log(msg);
})
.catch(err => {
reject("error");
console.log(err);
});
});
}
// 在另一个文件中调用该函数
async function checkStatus() {
try {
let status = await updatePass(newPasswd);
console.log(status); // 输出 "success" 或 "error"
} catch (err) {
console.error(err); // 如果有错误,则输出错误信息
}
}
checkStatus();
使用 async/await
如果你更喜欢使用 async/await,可以将 updatePass
函数定义为异步函数:
// 定义一个异步函数
async function updatePass(passwd) {
try {
let msg = await this.updateAttributes({ passwd: passwd });
console.log(msg);
return "success";
} catch (err) {
console.error(err);
return "error";
}
}
// 在另一个文件中调用该函数
async function checkStatus() {
let status = await updatePass(newPasswd);
console.log(status); // 输出 "success" 或 "error"
}
checkStatus();
解释
-
Promise:
updatePass
函数返回一个 Promise 对象。- 使用
.then
和.catch
处理成功或失败的情况。 - 调用者使用
await
等待 Promise 完成并获取结果。
-
async/await:
updatePass
函数被标记为async
。- 使用
try...catch
块来捕获可能的异常。 - 调用者使用
await
等待异步操作完成并获取结果。
这两种方法都能确保你可以在异步操作完成后获取到正确的状态值。选择哪种方法取决于你的具体需求和个人偏好。
同学你使用node的方法就是错误的。node是异步的~~
updatePass: function(passwd,callback) {
var status;
this.updateAttributes({passwd: passwd}).on('success', function(msg){
status = "success";
console.log(msg);
console.log("statusstatus:"+status);
callback(null, status);
}).on('failure', function(err){
status = "error";
console.log(err);
console.log("statusstatus:"+status);
callback(err);
});
}
model.updatePass(newPasswd,function(err,status){
console.log(status);
});
同步思维是程序员原始的思维还是后来养成的。。
噢,知道了。我错了。之前是放到回调函数里,结果没有运行,我以为是写在数据库定义文件中的updatePass中无法使用回调,结果是因为监听success后没有显示callback。。。
谢谢了,感激不尽~~
额,这个= =。