Отклонение обещания из-за обратного вызова - PullRequest
0 голосов
/ 29 марта 2020

У меня есть функция Promise

function test()
{
   let promise = new Promise<string>(function(resolve, reject)
        {
            func( resolve, reject );
        });
   return promise;
}

function func(resolve, reject )
{
    let reject2 = reject;

    window.on( "error", (msg) =>
    {
        console.log("inside error");
        reject2();
    } );

    // other stuff
}

В состоянии ошибки - я пытаюсь отклонить исходное обещание.

Кажется, это работает - но каждый раз, когда я создаю При возникновении ошибки сообщение «внутренняя ошибка» печатается много раз.

Спасибо.

Ответы [ 3 ]

1 голос
/ 30 марта 2020

Я думаю, что вы хотите удалить обработчик после его запуска.

Примерно так:

function test()
{ 
    let promise = new Promise<string>(function(resolve, reject)
    {
        func( resolve, reject );
    });
    return promise;
}

function func(resolve, reject )
{
  let reject2 = reject;

  let handler = (msg) =>
  {
    console.log("inside error");
    reject2();
    window.off( "error", handler ); //removing the handler here
  } 

  window.on( "error", handler);

 // other stuff
}

Но этот подход имеет проблему, которая удаляет все зарегистрированные обработчики при любой ошибке и Я не знаю, желательно ли это.

0 голосов
/ 30 марта 2020

Я не знаю, что вы хотите сделать, мое предположение было слишком длинным, чтобы комментировать, поэтому сделайте это. Совершенно уверен, что это проблема A-> B -> C.

!function(){
    let errorAttached = false,
        currentReject = null;
    function test()
    {
       let promise = new Promise(function(resolve, reject)
            {
                func( resolve, reject );
            });
       return promise;
    }

    function func(resolve, reject )
    {
        let currentReject = reject;
        if(!errorAttached) {
            window.on( "error", (msg) =>
            {
                console.log("inside error");
                currentReject();
            });
            errorAttached = true;
        }

        // other stuff
    }
}();
0 голосов
/ 30 марта 2020

Я не понял, почему вы создаете функцию обратного вызова для обработки результата вашего обещания. Я никогда не использовал этот способ. Возможно, вы хотите отменить свое обещание, когда что-то случится со страницей. В этом случае вы можете следовать примеру на этой странице. У вас будет куча способов реализовать это.

https://blog.bloomca.me/2017/12/04/how-to-cancel-your-promise.html

class CancelablePromise {
  constructor(executor) {
    let _reject = null;
    const cancelablePromise = new Promise((resolve, reject) => {
      _reject = reject;
      return executor(resolve, reject);
    });
    cancelablePromise.cancel = _reject;

    return cancelablePromise;
  }
}

// now lets work with the class
var cancelable = false;
const p = new CancelablePromise((resolve, reject) => {
  setTimeout(() => {
    if(!cancelable)
      resolve(console.log('resolved!'));
  }, 2000);
})

p.catch(error => console.log(error.toString()));

setTimeout(() => {
  cancelable = true;
  p.cancel(new Error("Whoops!"));
}, 1000); // change by 3000 to be resolved
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...