【问题标题】:JavaScript promises, resolve , rejectJavaScript 承诺、解决、拒绝
【发布时间】:2023-03-26 17:08:01
【问题描述】:

所以我想知道承诺的响应和拒绝对象是怎么回事。 我在读这个documentation 有些事情我还不清楚。

例如,resolve() 对象是关于什么的。

我已经看到这个东西可以包含在一个字符串中,然后resolve() 被启动? 这是怎么回事,有什么意义

var promise1 = new Promise(function(resolve, reject) {
  setTimeout(function() {
    resolve('foo');
  }, 300);
});

我最初认为只要回调函数返回一个值,解析函数/对象就会启动 然后可以继续.then()

所以我一直在玩这个东西一段时间,结果证明我的回报决心理论在 50% 的情况下有效,另外 50% 让我崩溃。

还有拒绝对象/函数,当我们说函数的结果是 0 但它必须是 1 才能继续时,你如何启动它?

var promise1 = new Promise(function(resolve, reject) {
   if(someFunction() === 0)
   {
     reject();
   } else {
     resolve()
   }
});

此代码仅在我的 someFunction() 中没有任何异步函数时有效,而且当我有任何异步函数时,它总是返回 undefined。

所以到目前为止,我还不清楚 Promise 的概念及其用途。

【问题讨论】:

  • 如果你在new Promise((resolve, reject)=>...)中调用resolve('some value'),它会将'some value'传递给.then()回调。如果你打电话给reject('some error'),它会做同样的事情,但对于.catch()回调,不会调用.then()
  • 只要someFunction() 是异步的,你就需要使用if (await someFunction() 并且你的promise 参数函数也应该是异步的。
  • resolvereject 是函数,而不仅仅是对象。 “我最初认为 resolve 函数 [...] 会在回调函数返回值时启动,然后它可以继续到 .then() — “回调函数”是指在new Promise(...) 内运行? return 是前进到 .then 的一种方式,但有时无法返回(例如基于嵌套事件的函数);那是使用resolve的时候。
  • @George “并且不会调用 .then() — then 接受两个参数。如果出现错误,将调用第二个。
  • 我发现这个博客很有用medium.com/front-end-weekly/…

标签: javascript promise


【解决方案1】:

你说得对,只要回调函数返回一个值,解析函数(哦,它们是函数)就会启动。

在你出现的情况下,该值返回了它的 'foo'

即使它不是这样的函数,它也相当于让函数返回一些东西。 所以到那时一切都很好。

当回调函数有任何异步代码时它不起作用,这只是因为你说它返回未定义。 该函数尚未完成运行,因此它返回。 它不等待它。 我能想到的最简单的解决方案就是将解决和拒绝对象传递给回调函数并从内部启动它们

例如

var promise1 = new Promise(function(resolve, reject) {
   someFunction(resolve,reject);
});

function someFunction(resolve,reject){
  var i = 0;
  setTimeout(function() {
    if(i===0){
      reject(/**You can even pass it some variables here if u wanted*/);
    } else {
      resolve(/**Same here*/); // this should work just fine and it will sucesfully launch .then with whatever u need returned 
    }
  }, 300);
}

【讨论】:

    猜你喜欢
    • 2019-08-06
    • 2013-06-22
    • 1970-01-01
    • 1970-01-01
    • 2021-11-02
    • 1970-01-01
    • 2014-08-10
    • 2016-01-16
    • 1970-01-01
    相关资源
    最近更新 更多