用蓝鸟建立JSON的承诺

时间:2016-03-03 09:18:18

标签: javascript json promise bluebird

我有一个uniq问题。我有JSON数据,表示生成承诺的步骤。

[
  {
     action: 'wait' 
  },
  {
     action: 'screenshot' 
  }
]

现在我正在与Bluebird产生这个承诺。

var pr = require('bluebird/js/main/promise')();
var R = require('bluebird');

var Worker = {
  open: function () {
    return new pr(function (resolve, reject) {
      resolve('opened');
    });
  },
  wait: function (milliseconds) {
    return pr.delay(milliseconds);
  },

  screenshot: function (milliseconds) {
    return new pr(function (resolve, reject) {
      resolve('take screenshot');
    });
  }
}

var defers = [];
Worker.open();
JSON.forEach(function (vl) {
  var defer = R.defer();
  defers.push(defer.promise);
  Worker[vl.action]().then(function () {
    // do something
    defer.resolve();
  });
});
R.all(defers).then(function () { console.log('finished');});

现在这不起作用,因为承诺没有链接。有人建议我把它们连在一起。

 var pr = require('bluebird/js/main/promise')();
var R = require('bluebird');

var Worker = {
  open: function () {
    return new pr(function (resolve, reject) {
      resolve('opened');
    });
  },
  wait: function (milliseconds) {
    return pr.delay(milliseconds);
  },

  screenshot: function (milliseconds) {
    return new pr(function (resolve, reject) {
      resolve('take screenshot');
    });
  }
}

var defers = [];
var chain = Worker.open();
JSON.forEach(function (vl) {
  var defer = R.defer();
  defers.push(defer.promise);
  chain = chain[vl.action]().then(function () {
    // do something
    defer.resolve();
  });
});
R.all(defers).then(function () { console.log('finished')});

但这对于如何从JSON数据生成基于承诺的函数的任何建议都没有用?

2 个答案:

答案 0 :(得分:2)

您想要采取一系列操作,并降低为单个Promise值。

const actions = [
  {action: 'wait'},
  {action: 'screenshot'}
];

const allDone = actions.reduce((promise, item) => 
  promise.then(Worker[item.action]), Promise.resolve());

allDone.then(() => console.log("All done!"));

这读作:"通过将项目的操作链接到.then()的承诺来减少数组,从空的Promise开始。"

每次请求,使用ES5(学习ES2015,它真棒!)

var actions = [
  {action: 'wait'},
  {action: 'screenshot'}
];

var allDone = actions.reduce(function(promise, item) {
  return promise.then(Worker[item.action])
}, Promise.resolve());

allDone.then(function() { 
  console.log("All done!"); 
});

答案 1 :(得分:-1)

我认为你对链接承诺感到有些困惑。

您需要在前一个操作的承诺的.then(...)中执行下一个操作。

var chain = Worker.open();
JSON.forEach(function (vl) {
    chain = chain.then(function () {
        //You need to return to promise from Worker[vl.action]() to correctly chain actions
        return Worker[vl.action]();
    });
    //"chain" is now synchronized with the promise of the last chained action
});