当前位置: 首页 > 知识库问答 >
问题:

在promise中使用wait

梁宏才
2023-03-14

必须将promise的回调定义为异步,这似乎有内在的问题:

return new Promise(async (resolve, reject) => {
  const value = await somethingAsynchronous();
  if (value === something) {
    return resolve('It worked!');
  } else {
    return reject('Nope. Try again.');
  }
});

这显然是一种反模式,因此可能会出现编码问题。我知道,即使在try/catch块中放置await语句,也很容易在此处捕获错误。

我的第一个问题是,当一个人想要用不同的resolve/reject值转发一个promise时,编写这样的代码的最佳方式是什么?那么,你要什么?即。

return new Promise((resolve, reject) => {
  somethingAsynchronous().then(value => {
    if (value === something) {
      return resolve('It worked!');
    } else {
      return reject('Nope. Try again.');
    }
  }); // errors would now be propagated up
});

或者你只是按照这里的建议把它全部去掉?

async function outerFunction() {
  const value = await somethingAsynchronous();
  return new Promise((resolve, reject) => {
    if (value === something) {
      return resolve('It worked!');
    } else {
      return reject('Nope. Try again.');
    }
  });
}

但是,您如何解释这样的代码呢?

async function outerFunction() {
  if (someSynchronousCheck()) {
    return 'Nope. Try again.' // another reject case
  }

  const value = await somethingAsynchronous();
  // ...
}

我觉得我把事情弄得比应该的更复杂了。我试图避免嵌套回调/链接然后/捕捉块,而不会在未来产生更多的问题。

我的最后一个问题是,为什么回调传递给一个Promise,而不是本质上的async?它已经封装在一个promise中,并期望异步调用resolve/reject函数。

共有3个答案

华和悦
2023-03-14

您也可以通过简单地这样做来链接自己的promise:

return new Promise((resolve, reject) => {
  somethingAsynchronous().then((value) => {
      if (value === something) {
        return resolve('It worked!');
      } else {
        return reject('Nope. Try again.');
      }
  }, (error) => { reject(error); });
});

我用这个已经有一段时间了,它对我非常有效。

楚弘益
2023-03-14

新promise(异步(解析、拒绝)=

考虑到promise异步代码可以通过async..await处理,因此promise构造函数的当前用例是非promise异步代码,例如:

new Promise(resolve => setTimeout(resolve, 1000))

Promise构造函数包含同步代码或涉及其他promise时,应使用async函数构造promise。替代品是asynciLife:

return (async (resolve, reject) => {
  const value = await somethingAsynchronous();
  if (value === something) {
    return 'It worked!';
  } else {
    throw 'Nope. Try again.';
  }
})();

如果与async一起使用时仍然需要Promise构造函数,那么Promise构造函数应该在层次结构中向下移动,这样它就不会包装任何async函数。

我的最后一个问题是,为什么回调传递给一个promise不是天生异步的?它已经封装在一个promise中,并期望异步调用resolve/reject函数。

async函数不仅仅是一个异步执行的函数,它返回另一个应该被利用的promise-或者至少用catch处理。Promise不应该利用从构造中返回的promise函数。

构造函数可以在相同的刻度上解析,并且不一定是异步的。

Promise.resolve(1);

是类似于

Promise(resolve => resolve(1))

而不是去

Promise(resolve => setTimeout(() => resolve(1)))

牟慎之
2023-03-14

你这样做:

async function outerFunction() {
  const value = await somethingAsynchronous();
  if (value === something) {
    return 'It Worked!';
  }
  throw Error('Nope. Try again.');
}

使用asyncouterFunction的结果包装为一个promise。

如果您想要将包装promise解析为某个东西,只需从async函数返回它。如果您希望包装promise被拒绝,请在async函数中抛出一个错误。

但是,您如何解释这样的代码呢?

async function outerFunction() {
  if (someSynchronousCheck()) {
    throw Error('Nope. Try again.');
  }

  const value = await somethingAsynchronous();
  // ...
}
 类似资料:
  • 我有一个API调用,它需要从MySQL数据库中提取一些信息,以便完成请求。问题是,NodeJS不会等待查询响应,我已经尝试用承诺来解决这个问题。下面是我的代码: 这个函数将返回Promise对象,这将触发SQL语法错误,因为这不是预期的数据库输入。我做错了什么?任何建议都非常感谢。

  • 问题内容: 这是我从这里看到的代码。我对关键字感到困惑。 对于,我需要? 对于,我需要? 问题答案: 无需在回调中使用return语句。Promise构造函数不期望回调返回任何类型的返回值。 因此,在该回调中使用语句的原因仅是为了控制该函数中的执行流程。 如果您希望回调内部的执行完成而又不执行该回调中的任何其他代码,则可以在此时发出a 。 例如,您可以这样编写代码,而无需声明: 在这种情况下,您使

  • 我正在尝试做的是创建一个chrome扩展,创建新的,嵌套的,书签文件夹,使用承诺。 执行此操作的函数是chrome.bookmarks.create()。但是我不能只循环这个函数,因为chrome.bookmarks.create是异步的。我需要等待,直到文件夹创建,并获得它的新ID,然后继续它的子级。 承诺似乎是要走的路。不幸的是,我找不到一个使用异步调用和自己的回调(如chrome.bookm

  • 问题内容: 我看到了一些使用 Promise 访问FB Graph API 的Facebook登录服务的示例。 范例1 : 以及获得响应时使用的服务 范例2 : JSFiddle 问题是: 上面的示例有什么 区别 ? 使用 $ q 服务的 原因 和 案例 是什么? __ 以及它如何 运作 ? 问题答案: 这并不是您问题的完整答案,但是希望当您尝试阅读服务文档时,这将对您和其他人有所帮助。我花了一段

  • 我试图理解为什么下面的promise设置不起作用。 (注意:我已经用async.map解决了这个问题。但是我想知道为什么我下面的尝试不起作用。) 正确的行为应该是:bFunc应该运行尽可能多的时间来读取所有映像文件(下面的bFunc运行两次),然后cFunc控制台打印“End”。 谢谢! 尝试1:它在cFunc()处运行并停止。 尝试2:在这种情况下,我使用了一个for循环,但是它执行得不正常。控

  • 本文向大家介绍浅谈JavaScript中promise的使用,包括了浅谈JavaScript中promise的使用的使用技巧和注意事项,需要的朋友参考一下 阅读目录 什么是Prmoise Promise的使用 最近在看《你不知道的javascript中卷》,发觉作者花了基本一半的篇幅去讲异步和promise,觉得有必要总结一下。 其实本文的目的是想手写一个Promise的,无奈总结着总结着发觉篇幅