相关疑难解决方法(0)

968
推荐指数
27
解决办法
19万
查看次数

如何避免在Node.js中长时间嵌套异步函数

我想创建一个显示来自数据库的一些数据的页面,所以我创建了一些从我的数据库中获取数据的函数.我只是Node.js的新手,所以据我所知,如果我想在一个页面中使用所有这些(HTTP响应),我必须将它们全部嵌套:

http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/html'});
  var html = "<h1>Demo page</h1>";
  getSomeDate(client, function(someData) {
    html += "<p>"+ someData +"</p>";
    getSomeOtherDate(client, function(someOtherData) {
      html += "<p>"+ someOtherData +"</p>";
      getMoreData(client, function(moreData) {
        html += "<p>"+ moreData +"</p>";
        res.write(html);
        res.end();
      });
    });
  });
Run Code Online (Sandbox Code Playgroud)

如果有很多这样的函数,那么嵌套就成了问题.

有办法避免这种情况吗?我想这与你如何组合多个异步函数有关,这似乎是一个基本的东西.

javascript asynchronous functional-programming node.js

156
推荐指数
8
解决办法
6万
查看次数

Node.js检测到两个猫鼬发现完成的时间

我正在尝试使用此初始化带有自动完成功能的两个输入.当我加载页面时,我将触发Ajax来初始化两个输入文本.

但我不知道当我的猫鼬发现完成时我怎么能发现.

这是我的服务器端代码:

app.post('/init/autocomplete', function(req, res){
    var autocomplete = {
        companies: [],
        offices: []
    };

    // Find all companies
    Company.find({}, function(err, companies) {
        if (err) throw err;

        companies.forEach(function(company) {
            autocomplete.companies.push({value: company.name})
        });

        console.log('One');
    });

    // Find all offices
    Office.find({}, function(err, offices) {
        if (err) throw err;

        offices.forEach(function(office) {
            autocomplete.offices.push({value: office.name})
        });

        console.log('Two');
    });

    console.log('Three');

    // res.json(autocomplete);
});
Run Code Online (Sandbox Code Playgroud)

我知道find方法是异步的.这就是为什么我按以下顺序看到我的console.log():

Three
One
Two
Run Code Online (Sandbox Code Playgroud)

如何完成并完成console.log('Three');时如何触发?Company.findOffice.find

我想看看console.log('Three');最后一个位置.

编辑:

我想我可以这样做:

app.post('/init/autocomplete', function(req, res){
    var autocomplete = { …
Run Code Online (Sandbox Code Playgroud)

javascript mongoose mongodb node.js promise

6
推荐指数
1
解决办法
1361
查看次数

用observable替换回调地狱

RxJS github repo解释了如何从事件或数组创建observable.我知道如何用异步或Promise替换回调地狱,但我找不到一个关于如何创建和返回我的函数执行异步任务的observable的示例.

例如,

x = getData();
y = getMoreData(x);
z = getMoreData(y);
...

getData(function(x){
    getMoreData(x, function(y){
        getMoreData(y, function(z){ 
            ...
        });
    });
});
Run Code Online (Sandbox Code Playgroud)

如何用observable替换这个回调地狱?我发现我们可以在RxJS github中调用observer.next()方法- 创建observable但是无法找出这个例子的实现.

javascript callback reactive-programming rxjs

3
推荐指数
1
解决办法
2998
查看次数