提问者:小点点

如何在async/await语法中拒绝?


如何拒绝函数返回的承诺?

例如:

foo(id: string): Promise<A> {
  return new Promise((resolve, reject) => {
    someAsyncPromise().then((value)=>resolve(200)).catch((err)=>reject(400))
  });
}

转换为:

async foo(id: string): Promise<A> {
  try{
    await someAsyncPromise();
    return 200;
  } catch(error) {//here goes if someAsyncPromise() rejected}
    return 400; //this will result in a resolved promise.
  });
}

那么,在这种情况下,我怎么能恰当地拒绝这个承诺呢?


共3个答案

匿名用户

您的最佳选择是一个包装该值,这将导致一个被拒绝的承诺,其中一个包装该值:

} catch (error) {
    throw new Error(400);
}

您也可以只值,但没有堆栈跟踪信息:

} catch (error) {
    throw 400;
}

或者,返回一个被拒绝的承诺,并用包装该值,但它不是惯用的:

} catch (error) {
    return Promise.reject(new Error(400));
}

(或者只是,但同样,没有上下文信息。)

在您的示例中,由于您使用的是,而/code>,因此您应该使用以下内容:

return Promise.reject<A>(400 /*or Error*/ );

的情况下,最后一个可能有点语义不匹配,但它确实有效。

如果抛出一个,它可以很好地处理使用语法的结果的任何内容:

try {
    await foo();
} catch (error) {
    // Here, `error` would be an `Error` (with stack trace, etc.).
    // Whereas if you used `throw 400`, it would just be `400`.
}

匿名用户

可能还应该提到的是,您可以在调用异步操作之后简单地链接一个函数,因为实际上仍然会返回一个承诺。

await foo().catch(error => console.log(error));

这样,如果您不喜欢语法,就可以避免它。

匿名用户

您可以创建一个包装函数,它接受一个promise,如果没有错误,则返回一个包含数据的数组,如果有错误,则返回错误。

function safePromise(promise) {
  return promise.then(data => [ data ]).catch(error => [ null, error ]);
}

在ES7和异步函数中使用如下所示:

async function checkItem() {
  const [ item, error ] = await safePromise(getItem(id));
  if (error) { return null; } // handle error and return
  return item; // no error so safe to use item
}