node.js Q.all在函数调用自身方面做出承诺

尼斯基维

我需要发出请求以获取html列表,并且需要对其进行扫描并遍历它,并对找到的列表中的每个项目进行更多的请求,其中可能包含列表,依此类推,直到没有列表为止。 。

我需要一种方法来跟踪所有已调用的请求,并在完成后调用另一个函数。棘手的是,该函数为HTML中找到的所有列表项反复调用自身。

我遇到的问题是使用Q Promises,它等待的唯一Promises是来自第一个请求,我不明白为什么假设节点的工作方式与我认为的一样,请参见代码:

var _ = require('underscore');
var request = require('request');

var allPromises = [];
var finalArray = [];

var start = function(id) {

  var deferred = Q.defer(); 

  request.get({
    url: 'http://www.example.com/id/' + id
  }, function() {

    _.each(body.items, function(index) {

      var item = this;

      finalArray.push(item);

      if(item.hasMore) {
        start(item.id);
      }
    }

    deferred.resolve();

  });

  allPromises.push(deferred.promise);

}

console.log('Starting');

start(1);

Q.all(allPromises).done(function (values) {
  console.log('All Done');
});

我以为发生了什么事:

1-首次调用starts()并创建第一个延迟的var
2-发出第一个请求,并将第一个创建的延迟的变量推入promises数组
3-Q.all被调用并等待

4-第一个请求的回调称为5-如果请求包含body.x,则使用新的ID再次调用start()
6-创建并推送新的Promise,并提出新的请求
7-解决第一个Promise

假设这只深入了一个层次

8-第二个承诺已解决
9-Q.​​all调用其回调

但是实际上,Q.all在第一个承诺之后调用其回调,即使第二个承诺在第一个承诺解决之前就被推送,它也不会等待其他任何回调。

为什么?我该如何进行这项工作?

更新忘记将循环添加到请求回调中。

杰罗曼达X

对已编辑问题的答案:

var request = require('request');

var finalArray = [];

var start = function(id) {

    var deferred = Q.defer();

    request.get({
        url: 'http://www.example.com/id/' + id
    }, function() {

        var subitems = [];
        _.each(body.items, function(index) {

            var item = this;

            finalArray.push(item);

            if(item.hasMore) {
                subitems.push(start(item.id));
            }
        }
        if (subitems.length) {
            deferred.resolve(Q.all(subitems)); // resolve result of Q.all
        } else {
            deferred.resolve();
        }
    });
    return deferred.promise;
}

start(1).done(function() {
    console.log('All Done');
});

@Bergi的代码

var request = require('request');

var start = function(id) {

    var deferred = Q.defer();

    request.get({
        url: 'http://www.example.com/id/' + id
    }, function(err, body) {
        if (err) deferred.reject(err);
        else deferred.resolve(body);
    });
    return deferred.promise.then(function(body) {
        var finalArray = [];
        return Q.all(_.map(body.items, function(index) {
            var item = this;
            finalArray.push(item);
            if(item.hasMore)
                return start(item.id);
            else
                return [];
        })).then(function(moreResults) {
            return finalArray.concat.apply(finalArray, moreResults);
        });
    });
}

start(1).then(function(finalArray) {
    console.log('All Done');
});

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Node.js Q承诺多个参数

来自分类Dev

Node.js Q调用多个参数

来自分类Dev

Node.js Q承诺forEach返回未定义

来自分类Dev

Node.js / Q:链接承诺按顺序

来自分类Dev

Node.js Q承诺then()链接不会等待

来自分类Dev

Node.js Q承诺forEach返回未定义

来自分类Dev

在node.js应用程序中使用q.js的q.all来实现并行异步

来自分类Dev

在node.js应用程序中使用q.js的q.all来实现并行异步

来自分类Dev

在Node JS中限制Q许诺并发

来自分类Dev

在Node.js中将异步代码转换为Q /承诺代码

来自分类Dev

使用Q使node.js fs.readFile作为承诺的操作

来自分类Dev

带有Express.js的Node + Q-有序的承诺

来自分类Dev

如何在不使用Node JS调用函数的情况下将函数调用推送到数组中以使用Q?

来自分类Dev

Node.js异步库比较-Q与异步

来自分类Dev

Node.js中的异步和Q Promise

来自分类Dev

Node.js Asynchronous Library Comparison - Q vs Async

来自分类Dev

带有node.js的Q异步库

来自分类Dev

Q Promise Node.js如何循环解析

来自分类Dev

使用Q Promises在node.js中链接GET请求

来自分类Dev

Phonegap / Cordova构建android node_modules / q / q.js抛出e;

来自分类Dev

运行量角器时出错... node_modules / q / q.js:155

来自分类Dev

使用Q,js进行Ajax调用

来自分类Dev

使用ExpressJS的Node + Q-有序的承诺

来自分类Dev

带有括号的Q.js“ then”困难调用函数

来自分类Dev

Q.js可以在没有node.js的情况下使用吗?

来自分类Dev

在Node.js中使用Q.js Promise进行循环的正确方法

来自分类Dev

从Powershell调用rmdir node_modules / S / Q

来自分类Dev

Node.js中的Promise.all不调用then函数

来自分类Dev

Node js,函数执行