【问题标题】:what is being promised in the promise returned by .then ( ) method?.then() 方法返回的承诺中承诺了什么?
【发布时间】:2020-04-27 18:09:27
【问题描述】:

我的问题 ID 与 Javascript 承诺相关。 Promise 构造函数允许我们编写解析或拒绝的逻辑。例如

let x = true;
const promise1 = new Promise(function(resolve, reject) {  
if (x == true){                              // Reject - Resolve logic 
    resolve('Success!');
  }
else {
    reject('Reject');
  }
});

但是现在如果我用 .then ( () => console.log('Hello')) 链接它,如果没有提供逻辑,它如何被接受或拒绝?

promise1.then(() => console.log('Hello') , undefined)
        .then(undefined , () => console.log('World'))
        .catch( () => console.log('Error'));

我的问题是:

1. new Promise 被接受或拒绝,然后调用 .then()'s onFullilled 或 onRejected。此外,.then() 返回一个新的 Promise。那么.then()返回的promise中承诺了什么?

2。我在哪里提供解决或拒绝.then() 返回的承诺的逻辑? (就像我在上面的构造函数中所做的那样)

另外,据我所知 - JS 中已经存在 resolve 和 reject 函数,它们会改变 Promise 状态

谢谢

【问题讨论】:

  • 您的意思是在您的if (x == true) 中省略else,这意味着当x 为真时它将同时解析拒绝?
  • @Wyck 错字。固定。
  • @Wyck 无法拒绝已解决的承诺。 console.assert(true === await new Promise((resolve, reject) => { resolve(true); reject(false)}))
  • @BlueWater86 解决后不拒绝的好风格:见stackoverflow.com/questions/32536049/…一个错字。请参阅 lynxx 的评论。
  • 同意。只是想指出一个承诺不能同时被解决和拒绝。

标签: javascript node.js promise


【解决方案1】:

一张图值1000字:

【讨论】:

    【解决方案2】:

    function promise1(data) {
    	return new Promise(function(resolve, reject) {
    		resolve(++data);
    	});
    }
    
    function promise2(data) {
    	return new Promise(function(resolve, reject) {
    		resolve(++data);
    	});
    }
    
    promise1(1)
    	.then(data => promise2(data))
    	.then(data => console.log(data));

    【讨论】:

      【解决方案3】:

      正如你正确提到的,一个承诺总是返回一个新的承诺。这可以处于 pendingresolved 状态。

      如果它解决了,它可以被有理由拒绝(意味着承诺没有做它应该做的事情)或resolved with a value(意味着 promise 成功完成了它的任务)。

      let x = true;
      const promise1 = new Promise(function(resolve, reject) {  
      if (x === true){                              
          resolve('Success!');
        }
      else {
          reject('Reject');
        }
      });
      

      现在,如果你在某个地方使用这个承诺,

      promise2 = promise1.then(val => {
        console.log(val); //logs "Success!"
        return "resolved value for promise2"
      })
      

      进一步,

      promise3 = promise2.then(val => {
        console.log(val); //logs "resolved value for promise2"
        return "some resolved value"
      })
      

      现在回到构造函数,对于x=false

      promise2 = promise1.catch(err => {
        console.log(err) //logs "Reject";
        return "resolved value from catch block";
      }) 
      
      promise3 = promise2.then(val => {
        console.log(val); //logs "resolved value from catch block"
        return "some resolved value"
      })
      

      或者你可以抛出一个错误来传播它,

      promise2 = promise1.catch(err => {
        console.log(err) //logs "Reject";
        throw "rejected value from catch";
      }) 
      
      promise3 = promise2.catch(val => {
        console.log(val); //logs "rejected value from catch"
        throw err;
      })
      

      重要的部分是你是在投掷还是从 catch 块返回? 在docs 上阅读更多信息。

      【讨论】:

        猜你喜欢
        • 2016-03-09
        • 2017-10-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-06-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多