один из них должен иметь такой эффект, что всякий раз, когда он выполняется, он должен изменять обработку других выполненных обещаний, которые еще не были обработаны или еще не обрабатываются.
Вы запускаете их все вместе? Что-то вроде:
promise1 = asyncFunc1()
promise2 = asyncFunc2()
promise3 = asyncFunc3()
Promise.all([promise1, promise2, promise3]).then(//sometthing)
Если да, это невозможно сделать, если функция обещания2 и функция обещания не ожидают события, блокировки или чего-то, что обрабатывается функцией обещания1.
Если это так, лучше организовать такие обещания, как:
asyncFunc1()
.then(() => asyncFunc2(paramIfOk))
.catch(() => asyncFunc2(paramIfFail))
В вашем примере:
const allItemsToBeDelivered = [myPromise1(), myPromise2(), ...]
myPromise1 () код должен ждать, пока элемент будетдоставлено и проверить, не ждет ли его кто-нибудь. Это проблема проектирования модели / кода, а не обещания.
Другой способ сделать это - рассмотреть некоторую логику, управляемую событиями: у сущности Customer есть прослушиватель для доставленного события, которое будет вызвано waitItemDelivered ()обещание непосредственно перед разрешением.
РЕДАКТИРОВАТЬ: в соответствии с запросом здесь немного больше подробностей о решении, управляемом событиями.
Краткий ответ: оно сильно зависит от вашего программного обеспечения.
Это уже что-то выпущено и запущено в производство? Будьте осторожны с такими изменениями. Если вы разрабатываете услугу, у вас еще есть время принять во внимание некоторые логические изменения. Решение, которое не меняет в корне то, как работает, но использует события, не так уж и хорошо, шаблоны смешивания никогда не окупаются в долгосрочной перспективе.
Пример:
const events = require('events');
class Customer() {
constructor(shop) {
this.emitter = new events.EventEmitter()
this.shopEventListener = shop.emitter
this.setupEventLinstening() // for keeping things clean in the constructor
// other properties here
}
setupEventLinstening() {
this.shopEventListener.on('product-delivered', (eventData) => {
// some logic
})
}
buyProduct() {
// some logic
this.emitter.emit('waiting-delivery', eventData)
}
}
class Shop() {
constructor(shop) {
this.emitter = new events.EventEmitter()
// other properties here
}
addCustomer(customer) {
customer.emitter.on('waiting-delivery', (eventData) => {
// some logic
self.waitDelivery().then(() => self.emitter.emit('product-delivered'))
})
}
waitDelivery() {
return new Promise((resolve, reject) => {
// some logic
resolve()
})
}
}
// setup
const shop = new Shop()
const customer = new Customer(shop)
shop.addCustomer(customer)
Это новыйспособ увидеть логику, но подобный подход можно использовать внутри обещания:
const waitDelivery = () => new Promise((resolve, reject) => {
logisticWaitDelivery().then(() => {
someEmitter.emit('item-delivered')
resolve()
})
}
const customerPromise = () => new Promise((resolve, reject) => {
someListener.on('item-delivered', () => {
resolve()
})
}
promiseAll([waitDelivery, customerPromise])