包装JavaScript承诺以解决不同的问题?

时间:2017-01-26 00:02:23

标签: javascript asynchronous promise

我是Async JS的新手。我在Firefox中添加了以下功能:

function addFoosToUrl(url, foos) {
    var promises = []
    foos.forEach(foo => {
        entry = { foo: foo, url: url }
        let promise = PlacesUtils.fooStuff.insert(entry)
        promises.push(promise)
    })

    return Promise.all(promises)
}

它按预期工作。函数PlacesUtils.keywords.insert在数据库中插入一个条目,并返回一个在完成后解析为null的Promise。因此,正如Promise.all() documentation所期望的那样,我的函数在插入所有条目后返回一个Promise,从PlacesUtils.keywords.insert解析为一个已解析值的数组,这是一个空数组。

似乎应该有一种方法来包装Promise.all(),以便我返回的Promise解析为对链接有用的东西,比如说url。有一种巧妙的方法吗?

2 个答案:

答案 0 :(得分:2)

Promise.all()返回另一个promise对象。看起来,你可以使用。然后链接从那里得到任何你想要的东西。

答案 1 :(得分:1)

将a。然后链接到返回Promise - 就像这样

function addFoosToUrl(url, foos) {
    var promises = []
    foos.forEach(foo => {
        entry = { foo: foo, url: url }
        let promise = PlacesUtils.fooStuff.insert(entry)
        promises.push(promise)
    })

    return Promise.all(promises).then(() => url);
}

或者,更简洁

function addFoosToUrl(url, foos) {
    return Promise.all(foos.map(foo => PlacesUtils.fooStuff.insert({ foo: foo, url: url }))).then(() => url);
}