2016-05-11 2 views
0

Мне нужно было вложить обещание в обещание, это нормально, или считается плохой практикой?Вложенные обещания для параллельного эффекта?

  1. У меня есть класс, который имеет метод, fetchArticles, fetchImages и main.
    • main является тот, который вызывает fetchArticles + fetchImages
    • fetchArticles выполняет функцию из другого файла, который возвращает обещание, но я также возвращение обещания на самом методе fetchArticles класса, поэтому, когда он принес статей, он будет работать и получать изображения.
    • fetchImages метод не обещал, но называет обещанную функцию из другого файла.

Я уверен, если это лучший способ для достижения эффекта parralel?

main() { 
    // Call the promised fetchArticles class method 
    this.fetchArticles() 
    .then (() => this.fetchImages(() => { 
     this.res.json(this.articles.data); 
    })); 
} 


fetchArticles() { 
    return new Promise ((fullfil, rej) => { 
     // Calling a promised function which simply returns an array of articles 
     fetchArticles (this.parametersForApiCall) 
     .then ((data) => { 
     this.articles.data = data; 
     this.articles.imageIds = [1,5,2,8,99,1000,22,44,55,120,241]; // Extract image IDS and save to class this 
     fullfil(); 
     }) 
     .catch ((err) => { 
     console.log ("Something went wrong with api call", err); 
     res.json({error: "Something went wrong", code: 1011}); 
     reject(); 
     }); 
    }); 
    } 

fetchImages (cb) { 
     // Calling a promised function which simply returns an array of images 
    fetchImages (this.imageIds).then((imgs) => { 
     this.images = imgs; 
     cb(); // Temp callback method 
    }).catch ((err) => { 
     console.log (err, "error finding images in then") 
    }) 
    } 
} 

Должен ли я использовать нечто вроде асинхронной параллели? Примечание. Я временно добавил callback в методе fetchImages, пока не найду хорошее решение для цепочки обещаний.

+1

вложенными обещает хорошие :) – winhowes

ответ

1

Несколько замечаний:

  1. вы создаете ненужное обещание в вашей fetchArticles функции. Вы можете сразу вернуть результат обеимиданных fetchArticles.

  2. Использование Promise.all позволит вам одновременно обезопасить оба предмета. Если ваши два метода не зависят друг от друга, тогда это хороший способ. Я обновил функцию main с помощью этого кода.

  3. Аналогичным образом, вы можете вернуть обещание непосредственно в своей функции fetchImages. Поскольку это также многообещающе, вам больше не нужен обратный вызов. Я удалил его.

Полученный код

main() { 
    // Call the promised fetchArticles and fetchImages class methods 
    Promise.all([this.fetchArticles(), this.fetchImages()]) 
     .then(() => this.res.json(this.articles.data)); 
} 


fetchArticles() { 
    // Calling a promised function which simply returns an array of articles 
    return fetchArticles (this.parametersForApiCall) 
    .then ((data) => { 
     this.articles.data = data; 
     this.articles.imageIds = [1,5,2,8,99,1000,22,44,55,120,241]; // Extract image IDS and save to class this 
    }) 
    .catch ((err) => { 
     console.log ("Something went wrong with api call", err); 
     res.json({error: "Something went wrong", code: 1011}); 
     reject(); 
    }); 
} 

fetchImages() { 
    // Calling a promised function which simply returns an array of images 
    return fetchImages (this.imageIds).then((imgs) => { 
     this.images = imgs; 
    }).catch ((err) => { 
     console.log (err, "error finding images in then") 
    }) 
    } 
} 
+0

я решил принять твое, как это гораздо более подробный! – James111

+0

Несомненно. Взгляните на мое объяснительное редактирование для какой-либо другой информации, которая может быть полезна. – Paarth

Смежные вопросы