我有一个三阶段混搭脚本,可以检查当地视频商店的最新租金,然后从烂番茄(RT)中获得批评者的百分比和一致意见:
$(document).ready(function(){
$('button').click(function (){
getNewRentals(url).then(function(ids){
var mapped = ids.map(function(id, f){
return function(){
return getRentalSpecs(id, f).then(function (f, name, year){
return getRotten(f, name, year); // Gets only f!
});
}
});
var m = mapped[0]();
for(var i = 1; i < mapped.length; i++) {
m = m.then(mapped[i]);
}
});
});
});
一切都很好,除了只有 f 传递给最后一个函数getRotten,但不是 电影名称,年< / i>的。映射循环一定有问题,因为所有三个函数都使用了相同的jquery getJSON(通过Yahoo YQL)包含在标准js promise中,这些promise同样解析为代码中提到的params。那么如果数据从第一个函数传递到第二个函数,为什么不从第二个函数传递到第三个函数呢?
我已经在这个回调/承诺中烤了几个星期了,而且现在已经非常起泡了。这也是我 SO 的第一篇文章,所以请耐心等待。
答案 0 :(得分:1)
promise表示单个值,它作为一个参数传递给任何then
处理程序。使用需要传递多个值的对象或数组(以较合适的为准):
$(document).ready(function () {
$('button').click(loadRotten);
});
function loadRotten () {
return getNewRentals(url)
.then(function (ids) {
return Promise.all(ids.map(getRentalSpecs));
})
.then(function (objects) {
return Promise.all(objects.map(function (obj) {
return GetRotten(obj.f, obj.name, obj.year);
});
// Or refactor `GetRotten` to accept a single object
// return Promise.all(objects.map(GetRotten));
});
});
}
// Or, using ES6, assuming refactor of `GetRotten`:
function loadRotten () {
return getNewRentals(url)
.then(ids => Promise.all(ids.map(getRentalSpecs)))
.then(objects => Promise.all(objects.map(GetRotten));
}
您必须修改getRentalSpecs
,以便使用包含f
,name
和year
属性的对象解析。
我已经重构了您的代码以使用Promise.all()
,这使得它更容易理解。似乎没有必要映射到函数表达式并手动调用每个函数表达式,因为它们不相互依赖。