簡體   English   中英

解決JSON數組中的所有Promise-JavaScript

[英]Resolve all promises in an array of json - javascript

我需要解析json數組中的所有promise,如下所示:

let list = [
    { 
        id: 1,
        data: new Promise((resolve, reject) => {
            resolve('Cat')
        })
    },
    { 
        id: 2,
        data: new Promise((resolve, reject) => {
            resolve('Dog')
        })
    },
    { 
        id: 3,
        data: new Promise((resolve, reject) => {
            resolve('Mouse')
        })
    }
]

我使用藍鳥承諾。 我使用了for循環來迭代所有項目,我想知道是否有某種更優雅的方法。

預期結果:

[ { data: 'Cat', id: 1 },
  { data: 'Dog', id: 2 },
  { data: 'Mouse', id: 3 } ]

Promise.all和array.map應該可以正常工作,但是結果是正確的

 let list = [ { id: 1, data: new Promise((resolve, reject) => { resolve('Cat') }) }, { id: 2, data: new Promise((resolve, reject) => { resolve('Dog') }) }, { id: 3, data: new Promise((resolve, reject) => { resolve('Mouse') }) } ] Promise.all(list.map(item => item.data.then(data => ({...item, data})))) // that's it, that's what you want, the rest is for show now .then(results => { console.log(results); }); 

但是,這是本承諾...您可能想查看bluebird中的Promise.props和/或Promise.map,以獲得可能更簡單的代碼

它可能很簡單

Promise.map(list, Promise.props)
.then(results => {
    console.log(results);
});

測試了上面的內容,是的,就是這么簡單-下面的代碼段具有我自己Promise.mapPromise.props版本-並且(至少在這種情況下)與bluebird一樣工作

 Promise.props = obj => { const keys = Object.keys(obj); return Promise.all(Object.values(obj)).then(results => Object.assign({}, ...results.map((result, index) => ({[keys[index]]: result})))); }; Promise.map = (array, fn, thisArg) => Promise.all(Array.from(array, (...args) => fn.apply(thisArg, args))); let list = [ { id: 1, data: new Promise((resolve, reject) => { resolve('Cat') }) }, { id: 2, data: new Promise((resolve, reject) => { resolve('Dog') }) }, { id: 3, data: new Promise((resolve, reject) => { resolve('Mouse') }) } ] Promise.map(list, Promise.props) .then(results => { console.log(results); }); 

帶有Promise.all和一些JavaScript。

let list = [];
let promise = Promise.all(list.map(entry => entry.data));
promise.then((results) => {
  let final = results.map((result, index) => {
    return {data: result, id: list[index].id};
  });
  console.log(final);
});

Promise.all可能很適合這里:

Promise.all(list.map(entry => entry.data)).then((resolved) => {
  // ...
});

您只需要創建一個承諾數組即可。 您可以使用formap

let promises = []

for(var i=0; i < list.length; i++)
  promises.push(list.data)

Promise.all(promises).then(resultList => { ... }).catch(err => { ... })

或最簡單的可能與map

Promise.all(list.map(p => p.data)).then(resultList => { ... }).catch(err => { ... })

您可以使用lodash lib最小化您的代碼

const _ = require('lodash');

Promise.all(_.map(list, 'data')).then((data)=>{
    list.map((item,ind)=>{item.data = data[ind]});
    console.log(list);
})

將Promise.all()解析為實際可用的JSON數組。

問題:Promise.all()解析為一系列已解決的Promise。 要查看為什么這是一個問題,請將其復制並粘貼到控制台中:

var promise1 = fetch('https://swapi.co/api/people/2'); // C-3PO
var promise2 = fetch('https://swapi.co/api/people/3'); // R2-D2

Promise.all([promise1, promise2])
    .then(res => console.log(res)); // resolved promises - trash...

看看那些解決的承諾中沒有實際可用的數據嗎? 在網絡上,您需要打電話給另一個諾言,將它們轉換為文本或html,或者很可能是最受歡迎的json。 但是如何有效地做到這一點?

好吧,那么我們的Promise.all()問題的解決方案是...更多Promise.all()!!!

例:

var promise3 = fetch('https://swapi.co/api/people/1'); // Luke
var promise4 = fetch('https://swapi.co/api/people/4'); // Luke's daddy

Promise.all([promise3, promise4])
    .then(res => Promise.all([res[0].json(), res[1].json()]))
    .then(res => console.log(res)); // real data :)

希望這對某人有幫助! 謝謝!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM