创建函数以正确链接承诺

时间:2016-07-30 19:22:15

标签: node.js promise bluebird

我正在努力让Promise链正确地为我工作。

我认为问题归结为理解之间的区别:

promise.then(foo).then(bar);

promise.then(foo.then(bar));

在这种情况下,我正在写foobar,我正在努力让签名正确。 bar确实采用foo生成的返回值。

我有后者工作,但我的问题是我需要做些什么来让前者工作?

与上述相关的是完整代码(如下)。我没有按照我期望的顺序打印不同的日志(期待log1log2log3log4log5,但是得到log3log4log5log1log2)。我希望如上所述,我也能做到这一点。

var Promise = require('bluebird');

function listPages(queryUrl) {
  var promise = Promise.resolve();

  promise = promise
    .then(parseFeed(queryUrl)
      .then(function (items) {

      items.forEach(function (item) {
        promise = promise.then(processItem(transform(item)))
                    .then(function() { console.log('log1');})
                    .then(function() { console.log('log2');});
      });

    }).then(function() {console.log('log3')})
  ).then(function() {console.log('log4')})
  .catch(function (error) {
    console.log('error: ', error, error.stack);
  });
  return promise.then(function() {console.log('log5');});
};

1 个答案:

答案 0 :(得分:2)

  

promise.then(foo).then(bar);promise.then(foo.then(bar));之间的区别是什么?

第二个是完全错误的。 then方法将回调作为其参数,而不是promise。该回调可能会返回一个promise,所以第一个相当于

promise.then(function(x) { return foo(x).then(bar) })

(假设foo也返回一个承诺)。

你的整个代码似乎搞砸了一下。它应该阅读

function listPages(queryUrl) {
    return parseFeed(queryUrl)
    .then(function (items) {
        var promise = Promise.resolve();
        items.forEach(function (item) {
            promise = promise.then(function() {
                console.log('log1');
                return processItem(transform(item));
            }).then(function() {
                console.log('log2');
            });
        });
        return promise;
    }).then(function() {
        console.log('log3')
    }, function (error) {
        console.log('error: ', error, error.stack);
    });
}