[英]Promise factories not working in Nodejs
我需要在Nodejs中执行一些异步任务。 在这种情况下,我需要迭代JSON的抛出级别。 出于这个原因,我需要同步地“反复”迭代该对象。
我正在使用此代码进行测试,这是从此站点改编而成的简单示例
var fnlist = [ doFirstThing, doSecondThing, doThirdThing, lastThing];
// Promise returning functions to execute
function doFirstThing(){ return Promise.resolve(1); }
function doSecondThing(res){ return Promise.resolve(res + 1); }
function doThirdThing(res){ return Promise.resolve(res + 2); }
function lastThing(res){ console.log("result:", res); }
// Execute a list of Promise return functions in series
function pseries(req,json,list) {
var p = Promise.resolve();
return doFirstThing()
.then((value) => {
console.log('value');
console.log(value);
return doSecondThing(value).then((value2) => {
console.log('value2');
console.log(value2);
});
});
}
router.get('/', function(req, res, next) {
var thisArray = json[0].array;
for(var i = 0;i < thisArray.length; i++){
pseries(req,json,fnlist);
}
});
控制台输出为:
1
value
1
value
1
value2
2
value2
2
value2
2
而且仍然无效,因为我需要进行以下流程:
value
1
value2
2
value
1
value2
2
value
1
value2
2
我知道我需要使用promise工厂 ,以便在创建它们时不立即执行它们,但是现在似乎无法正常工作。 我知道我不能使用.all,因为我需要使用下一个诺言中的一些数据。
有任何想法吗? 谢谢!
您已经在for
循环中启动了多个独立的pseries()
链(每次对pseries()
调用都是一个单独的pseries()
链)。 因此,您无法控制单独的承诺链的顺序。 如果要控制一个链与另一个链,则必须将它们链接起来(例如,将它们链接在一起),以便排序是明确的,而不是偶然的。
您看到的输出不足为奇,因为for
循环所做的第一件事是注册了一堆.then()
处理函数。 因为承诺已拆分为那些中, .then()
处理程序所有排队的你,就立即执行for
循环完成( .then()
处理器是始终排队异步运行)。 for
循环完成,然后运行第一批.then()
处理.then()
。 运行它们的过程将安排另外三个.then()
处理程序。 然后将它们排队,并在第一批.then()
处理函数完成后运行。 虽然我解释了为什么获得订单的可能逻辑,但不能保证。 这些是异步操作,您唯一知道的是它们会在将来完成一些不确定的时间。 如果您需要明确的命令,则必须通过对诺言的明确同步来强制执行。
您可以使用带有array.reduce()
的相当常见的设计模式,按照已知顺序通过数组对迭代进行排序:
router.get('/', function(req, res, next) {
var thisArray = json[0].array;
thisArray.reduce(function(p, item) {
return p.then(function() {
return pseries(req,json,fnlist);
});
}, Promise.resolve()).then(function(result) {
// all done here
}, function(err) {
// error here
});
});
尝试使用foreach链接所有的诺言:
var sequence = Promise.resolve();
// Loop through our chapter urls
story.chapterUrls.forEach(function(chapterUrl) {
// Add these actions to the end of the sequence
sequence = sequence.then(function() {
return getJSON(chapterUrl);
}).then(function(chapter) {
addHtmlToPage(chapter.html);
});
});
有关更复杂的组合,请查看以下页面: http : //www.html5rocks.com/zh_cn/tutorials/es6/promises/#toc-parallelism-sequencing
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.