javascript - 使用 bluebird 从 JSON 构建 Promise

标签 javascript json promise bluebird

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

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

现在我正在与 Bluebird 做出这个 promise 。

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');});

现在这不起作用,因为 promise 没有被链接。有人建议我把它们拴起来。

 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 数据生成基于 Promise 的函数有什么建议吗?

最佳答案

您想要采取一系列操作,并将其减少为单个 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!"));

这读作:“通过从空 Promise 开始,使用 .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!"); 
});

关于javascript - 使用 bluebird 从 JSON 构建 Promise,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35767854/

相关文章:

javascript - Node.js - 公开吗?

php - 拉维尔 4 : Fatal error: Class 'Patchwork\Utf8\Bootup' not found in autoload. PHP

java - 如何在 Java 中将 JSON 转换为 XML

javascript - 使用 Promise 更好地处理 AJAX 嵌套?

typescript - 将接口(interface)中的字段类型替换为 promise

管理(禁用和选中)某些复选框的 Javascript 函数

javascript - 将 javascript 对象键值推送到 javascript 对象键数组

javascript - Django 静态 js 文件不起作用

java - 在 JSON 对象中强制执行非空字段

node.js - MongoDB Promise 和结果处理