我目前正在编写一些工作异步的函数。想象一下这个例子
float meter= distFrom(LOCATION_LATITUDE1,LOCATION_LONGITUDE2,LOCATION_LATITUDE2,LOCATION_LONGITUDE2);
final float kilometer=meter/1000;
现在我想知道是否要返回回调或只是在我的函数中调用',我的意思是例如signUpUser(userInfo, callback) //callback(err, token)
createToken(userInfo, callback) // callback(err, token)
:
createToken
只要回调属于另一个程序员,并且如果由于某种原因他决定在他的代码中返回一些东西,这就会阻止它。
编辑:在我发布问题之后,我得到的答案是不可能返回任何内容,但随着我的代码和节点j的深入,我发现相反的情况。下面的代码运行良好!!
createToken(userInfo, callback) {
var token = ...;
callback(err, token); //or
return callback(err, token);
}
答案 0 :(得分:3)
你说你的功能是异步的。这意味着他们不能返回调用回调的结果,因为它们在调用回调之前返回。所以他们应该返回任何内容或一些有用的上下文值,但不能返回调用回调的结果。你的问题中有两个选择:
function createToken(userInfo, callback) {
startAsyncProcess(function() {
// It's done, may have failed (err), may have succeeded (token)
callback(err, token);
});
}
单独和有点偏离主题:使用promises而不是手动回调机制(除非手动样式当然适合大型已建立的代码库)。 E.g:
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
});
答案 1 :(得分:1)
如果你返回了回调,那么现在你将如何完成异步类的执行?
这就是为什么我们将回调发送到asyc工作,在完成其功能或从服务器获得响应后调用它。
您可以使用承诺和here MDN文档。
承诺背后的想法,你返回一个对象,该对象为你的异步动作的每个案例提供方法,如履行,拒绝