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();

解释

  1. Promise:

    • updatePass 函数返回一个 Promise 对象。
    • 使用 .then.catch 处理成功或失败的情况。
    • 调用者使用 await 等待 Promise 完成并获取结果。
  2. 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。。。
谢谢了,感激不尽~~

额,这个= =。

在Node.js中处理异步操作,通常需要使用回调函数、Promises或async/await来确保在执行后续代码之前等待异步操作完成。你遇到的问题是因为updatePass方法中的更新操作是异步的,而你在调用该方法后立即尝试访问status变量,这时异步操作可能还未完成。

为了确保异步操作完成后再获取其结果,可以将updatePass方法改为返回一个Promise,并在外部使用.then()方法或者使用async/await语法来处理异步逻辑。以下是一个示例:

使用Promise

// 定义一个返回Promise的updatePass方法
updatePass: function (passwd) {
    return new Promise((resolve, reject) => {
        this.updateAttributes({ passwd: passwd })
            .on('success', function (msg) {
                resolve("success");
                console.log(msg);
            })
            .on('failure', function (err) {
                reject("error");
                console.log(err);
            });
    });
}

在另一个文件中调用:

model.updatePass(newPasswd)
    .then(status => {
        console.log(status); // 此时可以获得状态
    })
    .catch(error => {
        console.error(error); // 处理错误
    });

使用async/await

如果更倾向于使用现代JavaScript语法,可以将方法包装成async函数并使用await关键字来等待异步操作完成:

// 定义一个async函数
const updatePassAsync = async function (passwd) {
    try {
        let result = await model.updatePass(passwd);
        console.log(result); // 在这里可以获取到状态
    } catch (error) {
        console.error(error); // 处理错误
    }
};

// 调用该async函数
updatePassAsync(newPasswd);

通过以上两种方式,你可以确保在异步操作完成后再获取到正确的返回值。

回到顶部