1

我将一些数据保存到我的 Polymer 元素内的 Firebase 数据库中。一切正常。但是,作为一个不熟悉 Promises 的人,我需要帮助来理解Promise.resolved()方法结束时的含义。之前的承诺不是在什么时候通过.then的吗?那么这到底是在做什么呢?我环顾四周,但找不到resolved()没有价值的例子。

以及如何将其更改为更熟悉的结构,如下所示:

.then(function(snapshot) {
  // The Promise was "fulfilled" (it succeeded).
}, function(error) {
  // The Promise was rejected.
});

这是块和Promise.resolved()文档中获取的内容:

saveData : function() {          
          this.$.document.data = this.$.message.value; 
          this.$.document.save("/parent", "child").then(function() {
            console.log('sent the event!!!!!!');
            this.$.document.reset();
          }.bind(this));

         return Promise.resolve();
        },
4

2 回答 2

4

首先你需要了解 Promises 的基础知识。

让我们从非常基础的开始——

新创建的 es6 Promise 处于以下状态之一:

  • 解决
  • 被拒绝
  • 待处理->等待解决或拒绝

让我们创建一个示例 Promise

var promise = new Promise(function(fulfill, reject) {
  // Do some stuff and either fullfill or reject the promise
});

所以上面的 Promise 接收到一个回调函数,也称为executor函数,带有签名function(fullfill, reject)

新创建的 Promise 还有一个非常重要的属性函数,称为then用于链接和控制逻辑流。

then接受两个可选的回调参数onFulfilledonRejected.

在这个executor函数中,有两件事恰好表明了 promise 的结果——

  • fullfill 方法在有或没有值的情况下被调用:

    表示操作成功完成。如果你用一个值调用完成,那么回调将接收该值,如果你决定在调用中不提供一个值,那么将用一个参数调用。onFulfilledthenfulfillonFulfilledundefined

    var promise = new Promise(function(fulfill, reject) {
       // lets assume operation completed successfully
       fulfill('Success');
    });
    
    promise.then(onFulfilled, onRejected);
    
    function onFulfilled(result) {
         console.log(result);
         // Success will be printed
    }
    
  • reject 方法在有或没有值的情况下被调用:
    执行操作时发生了一些问题。您可以决定是否传递一些错误消息reject回调以指示最终用户发生的错误。

    var promise = new Promise(function(fulfill, reject) {
       // lets assume operation did not complete successfully
       reject(new Error('Error'));
    });
    
    promise.then(onFulfilled, onRejected);
    
    function onRejected(error) {
         console.log(error.message);
         // Error message will be printed
    }
    

现在让我们谈谈Promise.resolve.

在顶部,您学习了如何通过构造函数创建 Promise。

var promise = new Promise(function (fulfill, reject) {
  fulfill('Success value');
});

// Now: Promise.resolve
// Exactly does the same thing as above code

var promise = Promise.resolve('Success value');

同样来了Promise.reject——

var promise = new Promise(function (fulfill, reject) {
  reject(new Error('Error VALUE'));
});

var promise = Promise.reject(new Error('Error VALUE'));

在您的情况下save,似乎已经在内部返回了一个承诺,该承诺可能正在调用其中一个fulfillreject方法,因此您不需要调用Promise.resolve(). 您只需要在方法中获取该承诺返回的fulfilled值或rejected值即可then

 saveData : function() {          
      this.$.document.data = this.$.message.value; 
      // return this promise
      return this.$.document.save("/parent", "child");
 }

saveData()
.then(function() {
        console.log('sent the event!!!!!!');
        this.$.document.reset();
      }.bind(this));

我希望它能让关于 Promise 的事情更加清晰。

于 2016-11-13T17:55:03.327 回答
1

如果您尝试能够做到obj.saveData().then(...),那么您可以像这样返回内部承诺:

 saveData : function() {          
      this.$.document.data = this.$.message.value; 
      // return this promise
      return this.$.document.save("/parent", "child").then(function() {
        console.log('sent the event!!!!!!');
        this.$.document.reset();
      }.bind(this));
 }
于 2016-11-13T05:05:25.687 回答