Node.js 节点按顺序运行

Node.js 节点按顺序运行,node.js,express,promise,Node.js,Express,Promise,亲爱的 如何在nodejs中按顺序运行承诺,在下面的示例中,我在小时数组中循环,然后为每个获取的小时从数据库中获取结果,这里的问题是:我获取结果,但我希望它按与获取小时相同的顺序进行 angular.forEach(SharedVar.getCategories(), function (h) { t = h.split('-', 2);

亲爱的

如何在nodejs中按顺序运行承诺,在下面的示例中,我在小时数组中循环,然后为每个获取的小时从数据库中获取结果,这里的问题是:我获取结果,但我希望它按与获取小时相同的顺序进行

angular.forEach(SharedVar.getCategories(), function (h) {
                                        t = h.split('-', 2);
                                        t = t[0];
                                        RESTApi.getAnswerdCallsByHour(t).then(function (answerdTotal) {
                                                $scope.answerdCallsTotalByHour.push(answerdTotal);
                                                var d = SharedVar.getDataS();
                                                d[count] = answerdTotal;
                                                SharedVar.setDataS(d);

                                                count++;

                                        });

                                });

谢谢,

依次执行的方法是在承诺内执行一个请求和下一个请求

我认为到目前为止,更好的方法是扩展SharedVar.setDataS(d)函数,使其不依赖于按顺序获取数据。比如拥有一个SharedVar.setDataS(d,index)并在RESTApi内的$http.get(或其他)函数调用中使用config var来提升该索引,从而实现承诺

如果您的RESTApi如下所示:

var RESTApi = {
  getAnswerdCallsByHour : function(hour) {
    var url = "bla.com/myservice?hour=" + hour;
    return $http.get(url).data;
  }
  // Some other Methods...
然后,当数据异步到达时,您需要一种方法来传递某些内容以“重新排序”数据,这可能是您计算的索引,或者在您的情况下可能是小时变量:

  var RESTApi = {
  getAnswerdCallsByHour : function(hour) {
    var url = "bla.com/myservice?hour=" + hour;
    var config = [];
    config.hour = hour;
    return $http.get(url, config); // Return the promise not just data or a specific field
  }
  // Some other Methods...
现在,当您的承诺已完成时,您可以访问“hour”变量,如下所示:

var d = SharedVar.getDataS();
d[promise.config.hour] = promise.data;
SharedVar.setDataS(d);
现在您知道了哪些数据与哪个请求相关,并且不需要按顺序接收数据。只有当小时数从0到23连续运行时,最后一项才能正常工作,如果不是这样,您需要:

  var RESTApi = {
  getAnswerdCallsByHour : function(hour, index) {
    var url = "bla.com/myservice?hour=" + hour;
    var config = [];
    config.index = index;
    return $http.get(url, config);
  }
  // Some other Methods...
  ...
  ...
  var d = SharedVar.getDataS();
  d[promise.config.index] = promise.data;
  SharedVar.setDataS(d);

Safari的答案是我通常如何处理这个问题。(很抱歉,我没有足够的代表发表评论…)您遇到了问题,因为提供的示例没有在后续循环中捕获和使用新承诺。请参见我对稍微修改过的版本的评论:

    var promise = Promise.resolve();
    angular.forEach(SharedVar.getCategories(), function (h) {
        t = h.split('-', 2);
        t = t[0];

        // You must capture the new promise here; the next loop will wait
        // for the promise returned from getAnswerdCallsByHour to resolve.
        promise = promise.then(function() {
            // Halt downstream promises until this returned promises finishes
            return RESTApi.getAnswerdCallsByHour(t).then(function (answerdTotal) {
                $scope.answerdCallsTotalByHour.push(answerdTotal);
                var d = SharedVar.getDataS();
                d[count] = answerdTotal;
                SharedVar.setDataS(d);

                count++;
            });
        });
    });

您的解决方案仍然存在相同的问题。每次我运行应用程序都会得到不符合顺序的结果。我尝试了你的建议,仍然面临同样的问题。我所做的是将索引传递给SharedVar.setData(d,index)。关于RESTApi,我只是从数据库中获取数据并返回计数。是的,如果你明白我想说的话,就不完全是舒尔了。我在回答中添加了一些代码。
    var promise = Promise.resolve();
    angular.forEach(SharedVar.getCategories(), function (h) {
        t = h.split('-', 2);
        t = t[0];

        // You must capture the new promise here; the next loop will wait
        // for the promise returned from getAnswerdCallsByHour to resolve.
        promise = promise.then(function() {
            // Halt downstream promises until this returned promises finishes
            return RESTApi.getAnswerdCallsByHour(t).then(function (answerdTotal) {
                $scope.answerdCallsTotalByHour.push(answerdTotal);
                var d = SharedVar.getDataS();
                d[count] = answerdTotal;
                SharedVar.setDataS(d);

                count++;
            });
        });
    });