相关疑难解决方法(0)

什么是明确的承诺构建反模式,我该如何避免它?

我编写的代码看起来像:

function getStuffDone(param) {           | function getStuffDone(param) {
    var d = Q.defer(); /* or $q.defer */ |     return new Promise(function(resolve, reject) {
    // or = new $.Deferred() etc.        |     // using a promise constructor
    myPromiseFn(param+1)                 |         myPromiseFn(param+1)
    .then(function(val) { /* or .done */ |         .then(function(val) {
        d.resolve(val);                  |             resolve(val);
    }).catch(function(err) { /* .fail */ |         }).catch(function(err) {
        d.reject(err);                   |             reject(err);
    });                                  |         });
    return d.promise; /* or promise() */ |     });
}                                        | }
Run Code Online (Sandbox Code Playgroud)

有人告诉我这个被称为" 延迟反模式 "或" Promise构造函数反模式 ",这个代码有什么不好,为什么这被称为 …

javascript promise q bluebird es6-promise

479
推荐指数
3
解决办法
7万
查看次数

JavaScript字符串是不可变的吗?我需要JavaScript中的"字符串构建器"吗?

javascript使用不可变或可变的字符串吗?我需要一个"字符串构建器"吗?

javascript string

223
推荐指数
5
解决办法
7万
查看次数

如何拒绝来自内部的承诺

这可能是一个愚蠢的问题,但是中间的承诺链,你如何拒绝来自其中一个函数的承诺呢?例如:

someActionThatReturnsAPromise()
    .then(function(resource) {
        return modifyResource(resource)
    })
    .then(function(modifiedResource) {
        if (!isValid(modifiedResource)) {
            var validationError = getValidationError(modifiedResource);
            // fail promise with validationError
        }
    })
    .catch(function() {
        // oh noes
    });
Run Code Online (Sandbox Code Playgroud)

不再引用原始的解析/拒绝功能或PromiseResolver.我应该添加return Promise.reject(validationError);吗?

javascript promise

77
推荐指数
1
解决办法
4万
查看次数

承诺中的重新抛出错误

我在教程中找到了以下代码:

promise.then(function(result){
    //some code
}).catch(function(error) {
    throw(error);
});
Run Code Online (Sandbox Code Playgroud)

我有点困惑:抓住电话会做什么吗?在我看来,它没有任何影响,因为它只是抛出了被捕获的相同错误.我的基础是常规try/catch的工作原理.

javascript promise

68
推荐指数
3
解决办法
4万
查看次数

承诺构造函数与拒绝调用vs抛出错误

在以下代码中:

var p1 = new Promise(function (resolve, reject) {
    throw 'test1';
});

var p2 = new Promise(function (resolve, reject) {
    reject('test2');
});

p1.catch(function (err) {
    console.log(err); // test1
});

p2.catch(function (err) {
    console.log(err); // test2
});
Run Code Online (Sandbox Code Playgroud)

从api 使用reject(in p2)Promise和使用错误(in p1)之间有什么区别throw吗?

它完全一样吗?

如果它相同,为什么我们需要reject回调呢?

javascript promise

55
推荐指数
3
解决办法
2万
查看次数

如何修复本地"异常"的"抛出"?

在处理REST API调用的此函数中,处理部分请求的任何被调用函数都可能抛出错误,表示应将错误代码作为响应发送.但是,函数本身也可能发现错误,此时它应该跳转到异常处理块.

static async handleRequest(req) {
    try {
        let isAllowed = await checkIfIsAllowed(req);
        if (!isAllowed) {
            throw new ForbiddenException("You're not allowed to do that.");
        }
        let result = await doSomething(req); // can also raise exceptions
        sendResult(result);
    } catch(err) {
        sendErrorCode(err);
    }
}
Run Code Online (Sandbox Code Playgroud)

Webstorm将throw使用以下消息强调:'throw' of exception caught locally. This inspection reports any instances of JavaScript throw statements whose exceptions are always caught by containing try statements. Using throw statements as a "goto" to change the local flow of …

javascript rest exception-handling node.js async-await

23
推荐指数
4
解决办法
1万
查看次数

等待 Promise.reject 或抛出错误来摆脱困境?

我正在将我的承诺链接代码重构为异步/等待风格。这样做的原因之一是我想要一个 catch 块来处理所有错误情况(如此处所述Understanding Promise Rejection in Node.js

我的问题是,当我遇到同步错误时,我应该致电await Promise.reject还是throw error退出该过程?我知道这两种方式都可以,但我更喜欢throw error。我已经知道我得到的结果无效,为什么还要等待?使用 throw 立即终止控制流似乎是更好的选择。

我不是在谈论承诺链(我的问题的全部要点),所以我不认为线程JavaScript Promises -reject vs. throw回答了我的问题。

我读过《Node.js 中的错误处理》一文,我认为它也没有给出答案。但它确实说了

给定的函数应该同步(使用 throw)或异步(使用回调或事件发射器)传递操作错误,但不能同时传递。...一般来说,使用 throw 并期望调用者使用 try/catch 的情况非常罕见...

我的异步函数可能会返回 Promise.reject。因此,我关心的是介绍两种传递错误的方法,正如该文章所反对的那样。

try {
   let result = await aysncFunc().
   if (!isResultValid(result)) { //isResultValid() is sync function 
      await Promise.reject('invalid result')
      //or throw 'invalid result'
   }
   ... //further processing
}
catch (error) {
  ...
}
Run Code Online (Sandbox Code Playgroud)

javascript node.js promise async-await

6
推荐指数
1
解决办法
5851
查看次数

不能从异步承诺执行程序函数中抛出错误

我一直试图理解为什么下面的代码没有抓住它throw.如果asyncnew Promise(async (resolve, ...部件中删除关键字,那么它可以正常工作,因此它与Promise执行程序是异步函数的事实有关.

(async function() {

  try {
    await fn();
  } catch(e) {
    console.log("CAUGHT fn error -->",e)
  }

})();

function fn() {

  return new Promise(async (resolve, reject) => {
    // ...
    throw new Error("<<fn error>>");
    // ...
  });

}
Run Code Online (Sandbox Code Playgroud)

这里的答案,这里这里重复一遍"如果你在任何其他异步回调中,你必须使用reject",但是"异步"它们并不是指async函数,所以我认为它们的解释不适用于此(如果他们这样做,我不明白如何).

如果不是throw我们使用reject,上面的代码工作正常.从根本上说,我想明白为什么throw不在这里工作.谢谢!

javascript node.js promise async-await

4
推荐指数
2
解决办法
1916
查看次数

如何将 Promise 'then' 的值发送到 'catch'?

我只是想问catch如果解析上的值不是预期的,我应该如何传递解析承诺。

例如

let prom = getPromise();

prom.then(value => {
    if (value.notIWant) {
        // Send to catch <-- my question is here, I want to pass it on the catch.
    }

    // Process data.
}).catch(err => {
    // Pass the error through ipc using json, for logging.
});
Run Code Online (Sandbox Code Playgroud)

我尝试使用throw,但对象无法解析为 json,只是得到一个空对象。

回答:

@BohdanKhodakivskyi 下面的第一条评论是我想要的答案。

@31py 答案也是正确的,但 @BohdanKhodakivskyi 解决方案要简单得多,并且会呈现相同的结果。

javascript json ipc promise

1
推荐指数
1
解决办法
3781
查看次数