繁体   English   中英

Promise工厂无法在Node.js中工作

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM