我应该返回回调还是只是运行它?

时间:2016-08-29 11:06:31

标签: javascript node.js

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

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

2 个答案:

答案 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文档。

承诺背后的想法,你返回一个对象,该对象为你的异步动作的每个案例提供方法,如履行拒绝