我有一个uniq问题。我有JSON数据,代表生成承诺的步骤。从蓝森林与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数据的承诺基于函数有什么建议?
你需要把'vl.action'内'chain.then(函数(){...})' ,而不是覆盖'链' – Bergi
你能写一个例子吗? – puppeteer701
请参阅[本示例](http://stackoverflow.com/a/18387432/1048572) – Bergi