首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >node.js和异步编程回文

node.js和异步编程回文
EN

Stack Overflow用户
提问于 2013-06-13 14:50:54
回答 4查看 1.5K关注 0票数 2

这个问题可能会重复。我是node.js和异步编程回文的新手。我在谷歌上搜索过很多例子,但是我还是有点困惑。

好的,通过google搜索,我了解到所有回调都是异步处理的。例如,让我们从 api中获取读取文件函数

Fs.readFile(文件名,选项,回调) //回调将异步处理fs.readFileSync(文件名,选项)

代码语言:javascript
复制
  var fs = require('fs');

    fs.readFile('async-try.js' ,'utf8' ,function(err,data){
        console.log(data);   })

    console.log("hii");

上面的代码将首先打印hii,然后打印文件的内容。

所以,我的问题是:

  1. 所有回调都是异步处理的吗?
  2. 下面的代码不是异步的,为什么以及如何使它成为? 函数计算(回调){ for(var i =0;i< 1000;i++){}回调(I);}函数打印(Num){console.log(“i的值为:”+ num);
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-06-13 15:01:28

所有回调都是异步处理的吗?

不一定。通常,它们是这样的,因为在NodeJS中,它们的目标是在长时间运行的任务完成后(通常是IO操作)恢复函数的执行(一个延续)。但是,您自己编写了一个同步回调,因此正如您所看到的,它们并不总是异步的。

下面的代码不是异步的,为什么和如何使它?

如果希望异步调用回调,则必须告诉Node“有时间执行”。换句话说,您将回调的执行推迟到稍后Node完成正在执行的执行时执行。

代码语言:javascript
复制
function compute(callback){
 for (var i = 0; i < 1000; i++);

 // Defer execution for later
 process.nextTick(function () { callback(i); });
}

输出:

代码语言:javascript
复制
hii
value of i is:1000

有关异步回调工作方式的更多信息,请阅读这篇博文解释了process.nextTick是如何工作的

票数 4
EN

Stack Overflow用户

发布于 2013-06-13 14:55:09

不,这是一个常规的函数调用。

除非强制回调,否则回调不会是异步的。一种很好的方法是在0毫秒的setTimeout内调用它。

代码语言:javascript
复制
setTimeout(function() { 
   // Am now asynchronous
}, 0);

通常,当调用函数涉及在服务器上发出新请求(例如打开一个新文件)时,回调是异步的,在等待它完成时停止执行是没有意义的。

票数 3
EN

Stack Overflow用户

发布于 2013-06-13 15:15:56

下面的代码不是异步的,为什么和如何使它?

代码语言:javascript
复制
function compute(callback){
  for(var i =0; i < 1000 ; i++){}
  callback(i);
}

我将假设您的代码试图说,“我需要执行1000次,然后在一切都完成时使用我的回调”。

即使您的for循环在这里也不能工作,因为想象一下:

代码语言:javascript
复制
function compute(callback){
  for(var i =0; i < 1000 ; i++){
    DatabaseModel.save( function (err, result) {
      // ^^^^^^ or whatever, Some async function here.
      console.log("I am called when the record is saved!!");
    });
  }
  callback(i);
}

在这种情况下,for循环将执行保存调用,而不是等待它们完成。因此,在您的示例中,您可能得到类似于(取决于时间)的输出。

代码语言:javascript
复制
I am called when the record is saved
hii
I am called when the record is saved
...

如果您的计算方法只在所有事情都完成(所有1000个记录都保存在数据库中)时才调用回调,我将查看异步 Node包,它可以为您轻松地完成此任务,为您将在Node中遇到的许多异步问题提供了模式。

因此,您可以重写计算函数如下:

代码语言:javascript
复制
function compute(callback){
  var count = 0
  async.whilst(
     function() { return count < 1000 },
     function(callback_for_async_module) {
        DatabaseModel.save( function (err, result) {
            console.log("I am called when the record is saved!!");
            callback_for_async_module();
            count++;
        });
     },
     function(err) {
       // this method is called when callback_for_async_module has
       // been called 1000 times

       callback(count);
  );
  console.log("Out of compute method!");
}

注意,计算函数的回调参数将在console.log("Out of compute method")之后的某个时候被调用。这个函数现在是异步的:应用程序的其余部分不等待compute完成。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17090162

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档