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