2017-01-26 6 views
0

私はAsync JSを初めて使用しています。 Firefoxに次のような機能を追加しました。JavaScriptをラップする別のものに解決する約束?

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から期待されるように、私の関数はすべてのエントリが挿入された後に確定値を返します。PlacesUtils.keywords.insertの解決された値の配列に解決されます。これはNULLの配列です。

urlのように、私が返すPromiseが何か連鎖に役立つように、Promise.all()をラップする方法があるようです。それを行うためのきちんとした方法はありますか?

答えて

1

チェーンリターンの約束に.then - あるいは、より簡潔にそう

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); 
} 
のような
2

Promise.all()は、別の約束オブジェクトを返します。それはあなたがそこから望むものを得るために連鎖を使うことができるようです。

関連する問題