2016-03-03 51 views
0

我有一个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数据的承诺基于函数有什么建议?

+0

你需要把'vl.action'内'chain.then(函数(){...})' ,而不是覆盖'链' – Bergi

+0

你能写一个例子吗? – puppeteer701

+0

请参阅[本示例](http://stackoverflow.com/a/18387432/1048572) – Bergi

回答

2

你想采取行动的阵列,并减少到一个单一的承诺值。

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()链项目的行动上的承诺,从空洞的承诺开始减少阵列”


每请求,与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!"); 
}); 
+0

让我更新我的问题,因为我认为我正在做类似的事情,但我不确定,请问您可以检查吗? – puppeteer701

+0

Thx男人,这个工程。 – puppeteer701

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