Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/hadoop/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何从回调中检索值?_Javascript_Node.js_Callback_Promise - Fatal编程技术网

Javascript 如何从回调中检索值?

Javascript 如何从回调中检索值?,javascript,node.js,callback,promise,Javascript,Node.js,Callback,Promise,如何从回调中检索值? 我需要先找到学生的名字,然后计算一些东西,然后返回结果。 按名称查找学生的函数返回err并导致回调,如 function findStudentAndCalculate(name, cb); cb是回调函数,它以err和student实例作为参数。 我通过了cb考试 function calculateSomething(err, st){ if(err) throw new Error("Error") var result = some stuff w

如何从回调中检索值? 我需要先找到学生的名字,然后计算一些东西,然后返回结果。 按名称查找学生的函数返回err并导致回调,如

function findStudentAndCalculate(name, cb);
cb是回调函数,它以err和student实例作为参数。 我通过了cb考试

function calculateSomething(err, st){
    if(err) throw new Error("Error")
    var result = some stuff with st;
    return result;
}
我应该使用name参数返回给定url的页面响应

findStudentAndCalculate("John", calculateSomething);

嗯,您没有为我们提供足够的信息,以便
findStudentAndCalculate
了解回调参数使用的值,或者您希望如何存储或返回回调中的
return
值,但是。一般来说当您将函数作为参数传入时,只需将函数视为使用参数作为函数名定义的函数。因此,在您的情况下,在
findStudentAndCalculate
中的某个点上,您将进行如下调用:

var someVariable = cb(errValue, stValue);
findStudent(name).then(calculateSomething).then(function (result) {
  // do something with result
})
。或者

return cb(errValue, stValue);
return calculateSomething(errValue, stValue);
然后,代码的作用就好像您直接调用了:

var someVariable = calculateSomething(errValue, stValue);
。或者

return cb(errValue, stValue);
return calculateSomething(errValue, stValue);

(分别)

此回调模式最常用于。考虑到您将帖子标记为“nodejs”和“promise”,我将假设
findStudentAndCalculate
是异步的(例如,它必须在某个数据库中查找学生,这需要时间),因此您无法直接使用它的返回值

这里有两种可能性:

  • 如果
    findStudentAndCalculate
    是一个典型的Node.js风格的异步函数(它看起来确实像一个典型的函数),那么它将不会返回任何有用的内容。相反,您需要在您提供的回调函数中完成所有工作(即,
    calculatemething
    本身)。换句话说,您不仅需要
    calculateSmething
    ,还需要
    calculateSmething,然后使用您计算的内容进行dosomething

  • 另一方面,如果
    findStudentAndCalculate
    返回a,则可以使用它的
    then
    方法“对计算结果进行处理”。这将允许您将用于计算的代码与使用该计算的代码分开。例如:

    findStudentAndCalculate(name, calculateSomething).then(function (result) {
      // do something with result
    })
    
    不过,这将是一种非常不寻常的构建承诺的方式。通常情况下,模式看起来更像这样:

    var someVariable = cb(errValue, stValue);
    
    findStudent(name).then(calculateSomething).then(function (result) {
      // do something with result
    })
    

  • 不过,正如塔莱明所说,我们确实需要更多关于
    findStudentAndCalculate
    的信息,才能更具体一些。

    你不需要。您可以在回调中使用该值。
    findStudentAndCalculate
    函数应该将数据传递到
    cb
    @cookiemonster我有这些函数,不能更改,我需要返回这个执行链的结果。如果你不能更改它们,那么你就卡住了。抱歉。这将假定
    findStudentAndCalculate()
    是同步的。虽然这是可能的,但它会让人纳闷为什么它会收到回调。@cookiemonster-我能想到原因。如果有一大堆函数依赖于学生信息,那么可能有人会设置一个函数,以标准方式检索学生信息,然后将其传递给下一个函数(名称实际上暗示了这一点)。我并不是说这是最佳的方法,但是,在对其他人的代码进行了多年的研究之后,我学会了不要太在意为什么人们选择了一种方法而不是另一种方法。:)