我应该返回回调还是直接运行它

Should I return the callback or just run it?

本文关键字:运行 返回 回调 我应该      更新时间:2023-09-26

我目前正在编写几个异步工作的函数。想象一下这个例子

signUpUser(userInfo, callback) //callback(err, token)
createToken(userInfo, callback) // callback(err, token)

现在我想知道是否返回回调或只是在我的函数中调用它们,我的意思是例如在createToken:

createToken(userInfo, callback) {
   var token = ...;
   callback(err, token); //or
   return callback(err, token);
}

因为只要回调属于另一个程序员,无论出于什么原因,如果他决定在他的代码中返回一些东西,这只是阻塞它。

EDIT:在我发布了我的问题之后,我得到的答案是不可能返回任何东西,但当我在代码和节点js中深入研究时,我发现了相反的情况。下面的代码运行良好!!

function foo(a, callback) {
    console.log(a);
    return callback(a);
}
function bar(a) {
    return a;
}
console.log(foo(3, bar));

您已经说过您的函数是异步的。这意味着它们不能返回调用回调的结果,因为它们在调用回调之前返回。因此,它们应该不返回任何内容或一些有用的上下文值,而不是调用回调的结果。那么在你的问题中的两个选择中:

function createToken(userInfo, callback) {
    startAsyncProcess(function() {
        // It's done, may have failed (err), may have succeeded (token)
        callback(err, token);
    });
}

另外,还有一点离题:考虑使用承诺而不是手动回调机制(当然,除非手动风格是为了适应大型已建立的代码库)。例如:
function createToken(userInfo) {
    return new Promise(function(resolve, reject) {
        startAsyncProcess(function() {
            if (/*...it succeeded...*/) {
                resolve(token);
            } else /* ...it failed... */ {
                reject(err);
            }
        });
    });
}

(当然,如果startAsyncProcess提供了一个承诺,您将使用该承诺。)

用法:

createToken(/*...info...*/)
    .then(function(token) {
        // It worked, use the token
    })
    .catch(function(err) {
        // It failed
    });

如果您返回了回调,那么您现在将如何执行异步类完成?

这就是为什么我们发送回调到异步工作,在完成它的功能或从服务器获得响应后调用它。

你可以使用Promises,这里是MDN文档。

承诺背后的思想,如果您返回一个对象,该对象具有每个异步操作的方法,如已完成已拒绝

相关文章: