Обещание отклонено "отклонено не определено" в моей цепочке обещаний - PullRequest
0 голосов
/ 04 мая 2019

У меня есть следующая цепочка Обещаний:

let promise         = new Promise((resolve, reject) => {
    imgToDisplay.onload = () => {
        resolve(imgToDisplay.width);
    }
})
.then((result) => {
    window.URL.revokeObjectURL(imgToDisplay.src);
    if (result >= 20)
        reject('Image width too large');
})
.then(() => {   
    //I do something with the image file here if it is not rejected
})
.catch((e) => {
    alert(e.message); //This happened, however "reject is not defined"
});

Я не сделал ни reject, ни resolve моего Обещания во втором then().Что я тут не так сделал?

Ответы [ 2 ]

1 голос
/ 04 мая 2019

Если вы не непосредственно внутри конструктора Promise, вы не можете вызвать reject, потому что он не находится в области видимости. Но если вы выбросите ошибку внутри .then, вы можете заставить поток управления перейти к следующему .catch в цепочке (пропуская .then с между):

let promise         = new Promise((resolve, reject) => {
  imgToDisplay.onload = () => {
    resolve(imgToDisplay.width);
  }
})
.then((result) => {
  window.URL.revokeObjectURL(imgToDisplay.src);
  if (result >= 20)
    // This will result in the Promise being rejected:
    throw new Error('Image width too large');
})
.then(() => {   
  //I do something with the image file here if it is not rejected
})
.catch((e) => {
  alert(e.message); //This happened, however "reject is not defined"
});

В этом случае, хотя, поскольку тест, который приводит к отклонению Promise, может быть выполнен в конструкторе Promise , вы можете вместо этого вызвать reject в конструкторе, если хотите:

let promise         = new Promise((resolve, reject) => {
  imgToDisplay.onload = () => {
    if (imgToDisplay.width >= 20) {
      reject('Image width too large');
    }
    resolve(imgToDisplay.width);
  }
})
0 голосов
/ 04 мая 2019

Используйте throw вместо отклонения в then обратном вызове

let promise         = new Promise((resolve, reject) => {
    imgToDisplay.onload = () => {
        resolve(imgToDisplay.width);
    }
})
.then((result) => {
    window.URL.revokeObjectURL(imgToDisplay.src);
    if (result >= 20)
        throw 'Image width too large';
})
.then(() => {   
    //I do something with the image file here if it is not rejected
})
.catch((e) => {
    alert(e.message); //This happened, however "reject is not defined"
});
...