Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/41.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_Asynchronous - Fatal编程技术网

Javascript 如何重写此异步方法以同步返回值?

Javascript 如何重写此异步方法以同步返回值?,javascript,node.js,asynchronous,Javascript,Node.js,Asynchronous,关于使Nodejs/Javascript方法同步有很多问题,但到目前为止,我看到的答案涉及到使用库,如async和fibred 但是要使用库,比如,,我必须用它们的包装器包装我的函数 我正在寻找一种解决方案,其中代码位于我的函数内(而不是在函数外包装) 例如,这是我的异步函数,它使用回调: function myFunc(callback) { // Classic database fetch which is asynchronous db.find("foo", function(

关于使Nodejs/Javascript方法同步有很多问题,但到目前为止,我看到的答案涉及到使用库,如
async
fibred

但是要使用库,比如
,我必须用它们的包装器包装我的函数

我正在寻找一种解决方案,其中代码位于我的函数内(而不是在函数外包装)

例如,这是我的异步函数,它使用回调:

function myFunc(callback) {
  // Classic database fetch which is asynchronous
  db.find("foo", function(err, results) {
    callback(err, results);
  });
}
我希望函数返回结果:

function myFunc() {
  // Make this function synchronous, and return the result
  // ...

  return results;
}
我该怎么做


再一次,我不想用其他函数包装
myFunc
。我在想睡眠循环是否有效?

不,不能使用循环等待异步调用。Javascript是单线程的,因此需要将控制权返回到主事件处理程序,以便调用异步回调。如果运行循环,数据库查询完成的事件将在队列中等待,并且永远不会被处理


你能做的是回报一个承诺,而不是结果本身。这是一个跟踪回调是否被调用的对象,有一个回调可以放置结果的属性,并且有一个在需要时获取结果的方法(使用回调,因为一旦使用异步方法,就不能完全同步处理).

如果您想要从异步函数获得实际返回值,那么除了使用生成器或承诺之外,您别无选择。 您将始终必须包装您的函数,或者直接返回承诺


最有希望的库之一是
bluebird
,它还解释了如何以及为什么使用它()。如果您需要与节点样式回调接口,或者需要公开依赖于节点样式回调而不是承诺的API,它还提供了一些方便的方法来自动化转换。

使用generator的解决方案是什么样的?