从回调内部拒绝承诺

时间:2020-03-29 20:50:58

标签: javascript promise

我有一个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 个答案:

答案 0 :(得分:1)

我认为您想在触发处理程序后将其删除。

类似这样的东西:

while read IP
do  echo set security zones security-zone 1 address-book address H-$IP $IP/32 -
    echo set security zones security-zone 1 address-book address-set GROUP address H-$IP
done <File >new_file

但是这种方法存在一个问题,它将在出现任何错误时删除所有已注册的处理程序,并且我不知道是否需要这样做。

答案 1 :(得分:0)

我不知道您想做什么,我的猜测太长了,无法发表评论,因此请尝试一下。非常确定这是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
    }
}();

答案 2 :(得分:-1)

我不明白您为什么要创建一个回调函数来处理诺言的结果。我从来没有用过这种方式。当页面出现问题时,您可能想取消承诺。在这种情况下,您可以按照此页面上的示例进行操作。您将有很多方法来实现它。

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