如何通过映射的承诺传递数据?

时间:2016-07-02 10:00:47

标签: javascript jquery dictionary nested es6-promise

我有一个三阶段混搭脚本,可以检查当地视频商店的最新租金,然后从烂番茄(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 的第一篇文章,所以请耐心等待。

1 个答案:

答案 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,以便使用包含fnameyear属性的对象解析。

我已经重构了您的代码以使用Promise.all(),这使得它更容易理解。似乎没有必要映射到函数表达式并手动调用每个函数表达式,因为它们不相互依赖。